我试图从类类型中获取基本类的类型参数名称(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;。
答案 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()
以您喜欢的任何标准来清除“坏”名称。