c#获取泛型类中泛型类型参数的名称

时间:2018-05-25 10:37:00

标签: c# generics

我试图从类类型中获取基本类的类型参数名称(ClassName<TypeParameterName>)。

例如:

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

我搜索了很多,并没有找到任何关于如何做到这一点。 我唯一想到的是使用StreamReader并读取整个.cs文件并找到文本中的类型。但有没有更快/更清洁的方法呢?

注意:我没有尝试获取Type1的类型我试图获取字符串&#34; Type1&#34;。

3 个答案:

答案 0 :(得分:3)

在您的示例中,您已将通用类型参数设置为int,因此您无法获得Type1

试试这个:

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

答案 1 :(得分:0)

尝试以下方法:

       .
       .
       .
      //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

答案 2 :(得分:0)

我说让它成为一个适用于所有类型的好的扩展方法,这似乎适合您的代码分析场景。

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()以您喜欢的任何标准来清除“坏”名称。