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

本文关键字:参数 泛型 获取 反射 | 更新日期: 2023-09-27 18:32:35

假设我有一个这样的 C# 类:

class MyClass<Tkey,Tvalue>{}

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

编辑我的类类型未知,所以它可以是这样的

class MyClass2<Ttype>{}

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

首先

必须使用"类型"上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)