C# 使用反射获取泛型参数名称
本文关键字:参数 泛型 获取 反射 | 更新日期: 2023-09-27 18:32:35
假设我有一个这样的 C# 类:
class MyClass<Tkey,Tvalue>{}
如何从给定的类型实例获取"Tkey"
和"Tvalue"
?我需要参数名称,而不是类型。
编辑我的类类型未知,所以它可以是这样的
class MyClass2<Ttype>{}
也
首先
必须使用"类型"上GetGenericTypeDefinition()
的方法,以获取表示泛型模板的另一个类型。然后,您可以使用GetGenericArguments()
来接收原始占位符的定义,包括其名称。
例如:
class MyClass<Tkey, Tvalue> { };
private IEnumerable<string> GetTypeParameterNames(Type fType)
{
List<string> result = new List<string>();
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<string, string>();
AnalyseObject(object1);
var object2 = new List<string>();
AnalyseObject(object2);
AnalyseObject("SomeString");
}
您可以使用
Type.GetGenericArguments
来获取类型。您可以从中选择名称:
IEnumerable<string> genericParameterNames = instance.GetType().GetGenericArguments().Select(t => t.Name);
编辑:
要获得通用参数的名称,您应该查看NineBerry的答案。它的简化版本是这样的:
IEnumerable<string> genericParameterNames = instance.GetType()
.GetGenericTypeDefinition()
.GetGenericArguments()
.Select(t => t.Name)