如何获取数组中方法中使用的泛型类型?

Mik*_*erk 1 .net c# generics reflection types

我有这个通用方法,我想确保指定的类型是枚举.现在我知道我做不了类似的事情where T:enum.但我想在运行时确保.

我知道我可以这样做typeof(T).IsENum.但我想用这样的反射

public static List<Tuple<T, Y>> Produce<T, Y>()
    where T: struct, IConvertible
    where Y: struct, IConvertible
{
    var methodInfo = System.Reflection.MethodBase.GetCurrentMethod();
    foreach(var typeInMethod in methodInfo.GetGenericArguments()) 
        CheckTypeIsEnum(typeInMethod);
Run Code Online (Sandbox Code Playgroud)

问题是methodInfo.GetGenericArguments()返回的类型不是我指定的枚举类型.但相反,他们是TYBaseType: {Name = "ValueType" FullName = "System.ValueType"}.

总结:如何获取方法中使用的所有泛型类型的数组?

PS .Net 4.5

Jon*_*eet 7

你应该只使用typeof(T)typeof(Y)- 那些将为你提供实际的泛型类型参数.在这里使用反射没有任何好处:它很慢并且给你错误的答案!据我所知,泛型类型参数在执行时只能用于反射.特别是,您当前正在调用的方法(MethodBase.GetCurrentMethod)明确表明您的方法不起作用:

如果当前正在执行的方法是泛型方法,则GetCurrentMethod返回泛型方法定义.

(换句话说,它指定的类型参数没有版本-只知道,你有TY,而不是它们是什么.)

所以只需摆脱你的循环,并使用:

CheckTypeIsEnum(typeof(T));
CheckTypeIsEnum(typeof(Y));
Run Code Online (Sandbox Code Playgroud)

还要注意,有一点IL hackery,你可以有一个约束where T : enum.它不是有效的C#,但它是有效的IL和C#编译器服从它正在看IL的约束:)请参阅我的Unconstrained Melody项目的一个例子.