C#使用reflection获取通用参数名称
说我有一个像这样的C#类:
class MyClass{}
如何从给定的Type实例中获取"Tkey"
和"Tvalue"
? 我需要参数名称,而不是Type。
编辑我的类是未知的类型,所以它可能是类似的
class MyClass2{}
同样
首先必须在Type上使用方法GetGenericTypeDefinition()
来获取另一个表示通用模板的Type。 然后,您可以在其上使用GetGenericArguments()
来接收原始占位符的定义,包括它们的名称。
例如:
class MyClass { }; private IEnumerable GetTypeParameterNames(Type fType) { List result = new List (); if(fType.IsGenericType) { var lGenericTypeDefinition = fType.GetGenericTypeDefinition(); foreach(var lGenericArgument in lGenericTypeDefinition.GetGenericArguments()) { result.Add(lGenericArgument.Name); } } return result; } private void AnalyseObject(object Object) { if (Object != null) { var lTypeParameterNames = GetTypeParameterNames(Object.GetType()); foreach (var name in lTypeParameterNames) { textBox1.AppendText(name + Environment.NewLine); } } } private void button1_Click(object sender, EventArgs e) { var object1 = new MyClass(); AnalyseObject(object1); var object2 = new List (); AnalyseObject(object2); AnalyseObject("SomeString"); }
您可以使用Type.GetGenericArguments
来获取类型。 从中他们可以选择名称:
IEnumerable genericParameterNames = instance.GetType().GetGenericArguments().Select(t => t.Name);
编辑 :
要获取generics参数的名称 ,您应该看看NineBerry的答案 。 它的简化版本是这样的:
IEnumerable genericParameterNames = instance.GetType() .GetGenericTypeDefinition() .GetGenericArguments() .Select(t => t.Name)