说我有一个像这样的C#类:
class MyClass<Tkey,Tvalue>{}
如何从给定的Type实例中获取"Tkey"
和"Tvalue"
?
我需要参数名称,而不是Type。
修改 我的班级类型不详,所以它可能类似于
class MyClass2<Ttype>{}
以及
答案 0 :(得分:2)
首先必须在Type上使用方法GetGenericTypeDefinition()
来获取另一个代表通用模板的Type。然后,您可以使用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");
}
答案 1 :(得分:1)
您可以使用Type.GetGenericArguments
获取类型。从中他们可以选择名称:
IEnumerable<string> genericParameterNames = instance.GetType().GetGenericArguments().Select(t => t.Name);
修改强>:
要获取通用参数的名称,您应该查看NineBerry's answer。它的简化版本是:
IEnumerable<string> genericParameterNames = instance.GetType()
.GetGenericTypeDefinition()
.GetGenericArguments()
.Select(t => t.Name)