C#使用反射获取通用参数名称

时间:2016-01-30 09:05:29

标签: c# generics reflection

说我有一个像这样的C#类:

class MyClass<Tkey,Tvalue>{}

如何从给定的Type实例中获取"Tkey""Tvalue"? 我需要参数名称,而不是Type。

修改 我的班级类型不详,所以它可能类似于

class MyClass2<Ttype>{}

以及

2 个答案:

答案 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)