bugfix> c# > 投稿

型パラメーターの名前( ClassName<TypeParameterName> を取得しようとしています。 )クラスタイプのジェネリッククラス。

たとえば、次のようなものです。

class MyClass<Type1>
{
    public Type data;
}
static void Main()
{
    Console.WriteLine(typeof(MyClass<int>).GetTypeParameterName());
    //prints: Type1
}

私はよく検索しましたが、これを行う方法については何も見つかりませんでした。 私が考えたのは StreamReader を使うことだけでした.csファイル全体を読み、テキスト内のタイプを見つけます。しかし、これを行うためのより高速でクリーンな方法はありますか?

注:Type1のタイプを取得しようとはしていません。文字列「Type1」を取得しようとしています。

回答 3 件
  • この例では、ジェネリック型パラメーターを既に int に設定しています 、あなたはあなたの Type1 を取得しません 。

    これを試して:

    class MyClass<Type1>
    {
        public Type data;
    }
    static void Main()
    {
        Console.WriteLine(typeof(MyClass<>).GetGenericArguments()[0].Name);
        //prints: Type1
    }
    
    

  • 以下を試してください:

          .
           .
           .
          //Create and object of the relevant generic class
           ClassName<string> d = new ClassName<string>();
           // Get a Type object representing the constructed type.
           Type constructed = d.GetType();
           Type generic = constructed.GetGenericTypeDefinition();
           DisplayTypeInfo(generic);
        }
        private static void DisplayTypeInfo(Type t)
        {
            Console.WriteLine("\r\n{0}", t);
            Console.WriteLine("\tIs this a generic type definition? {0}", 
                t.IsGenericTypeDefinition);
            Console.WriteLine("\tIs it a generic type? {0}", 
                t.IsGenericType);
            Type[] typeArguments = t.GetGenericArguments();
            Console.WriteLine("\tList type arguments ({0}):", typeArguments.Length);
            foreach (Type tParam in typeArguments)
            {
                Console.WriteLine("\t\t{0}", tParam);
            }
        }
    
    

    ソース: https://msdn.microsoft.com/en-us/library/system.type.getgenerictypedefinition(v=vs.110).aspx

  • コード分​​析のシナリオに合うと思われる、すべてのタイプで機能する素晴らしい拡張メソッドにしましょう。

    static class TypeExtensions {
        public static IEnumerable<string> GetGenericTypeParameterNames(this Type type) {
            if (type.IsGenericTypeDefinition) {
                return type.GetGenericArguments().Select(t => t.Name);
            } else if (type.IsGenericType) {
                return type.GetGenericTypeDefinition().GetGenericArguments().Select(t => t.Name);
            } else {
                return Enumerable.Empty<string>();
            }
        }
    }
    
    

    typeof(MyClass<int>).GetGenericTypeParameterNames()  は Type1 です 、 typeof(int).GetGenericTypeParameterNames()  空です。 .Where() を使用する  「悪い」名前を取り除くためにどんな基準でも喜ばせます。

あなたの答え