如何通过反射获取通用参数名称

列罗

给定泛型类

class Foo<TData> { }

和具体类型

var type = typeof(Foo<string>) //Fpp`[System.String]
var genericType = type.GetGenericTypeDefinition(); //Foo`1[TData]

我想得到“TData”。或者另一种方式:根据泛型参数名称获取泛型参数的值:

GetGenericArgumentType(typeof(Foo<string>), "TData") //should return System.String
酒园

以下是可行的:(这只是为了演示,它假设类型是泛型的,并且参数名称确实存在)

public string GetGenericArgumentType(Type type, string paramName)
{

    var genericType = type.GetGenericTypeDefinition(); 

    var genericParam = genericType
        .GetGenericArguments()
        .Select((t, i) => new { Index = i, t.Name })
        .First(arg => arg.Name == paramName);

    return type.GetGenericArguments()[genericParam.Index].Name;
}

class GenericFoo<TData, TSecondData> { }

public void GetGenericArgumentTypeTest()
{
    string name1 = this.GetGenericArgumentType(
                        typeof(GenericFoo<string, int>), "TData"); //String
    string name2 = this.GetGenericArgumentType(
                        typeof(GenericFoo<string, int>), "TSecondData"); //Int32
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章