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)