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()返回的类型不是我指定的枚举类型.但相反,他们是T和Y和BaseType: {Name = "ValueType" FullName = "System.ValueType"}.
总结:如何获取方法中使用的所有泛型类型的数组?
PS .Net 4.5
你应该只使用typeof(T)和typeof(Y)- 那些将为你提供实际的泛型类型参数.在这里使用反射没有任何好处:它很慢并且给你错误的答案!据我所知,泛型类型参数在执行时只能用于反射.特别是,您当前正在调用的方法(MethodBase.GetCurrentMethod)明确表明您的方法不起作用:
如果当前正在执行的方法是泛型方法,则
GetCurrentMethod返回泛型方法定义.
(换句话说,它指定的类型参数没有版本-只知道,你有T和Y,而不是它们是什么.)
所以只需摆脱你的循环,并使用:
CheckTypeIsEnum(typeof(T));
CheckTypeIsEnum(typeof(Y));
Run Code Online (Sandbox Code Playgroud)
还要注意,有一点IL hackery,你可以有一个约束where T : enum.它不是有效的C#,但它是有效的IL和C#编译器服从它正在看IL的约束:)请参阅我的Unconstrained Melody项目的一个例子.