C# 如何获取数组中方法中使用的泛型类型?
我有这个泛型方法,我想确保指定的类型是枚举。 现在我明白了我不能做像C# 如何获取数组中方法中使用的泛型类型?,c#,.net,generics,reflection,types,C#,.net,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 method
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);
公共静态列表生成()
其中T:struct,IConvertible
其中Y:struct,IConvertible
{
var methodInfo=System.Reflection.MethodBase.GetCurrentMethod();
foreach(methodInfo.GetGenericArguments()中的var typeInMethod)
CheckTypeIsEnum(typeInMethod);
问题是methodInfo.GetGenericArguments()返回的类型不是我指定的枚举类型,而是类型t
和Y
和BaseType:{Name=“ValueType”FullName=“System.ValueType”}
摘要:如何获取方法中使用的所有泛型类型的数组
p.S..NET4.5您应该只使用typeof(T)
和typeof(Y)
-这些将为您提供实际的泛型类型参数。在这里使用反射没有任何好处:它速度慢并且给出错误的答案!据我所知,泛型类型参数在执行时根本不可用于反射。特别是,您当前调用的方法()明确说明您的方法不起作用:
如果当前执行的方法是泛型方法,GetCurrentMethod
返回泛型方法定义
(换句话说,没有指定类型参数的版本-它只知道您有t
和Y
,但不知道它们是什么。)
因此,只要摆脱循环,使用:
CheckTypeIsEnum(typeof(T));
CheckTypeIsEnum(typeof(Y));
还要注意的是,有了一点IL黑客技术,您可以有一个约束,即T:enum。它不是有效的C,但它是有效的IL,并且C编译器遵守它所查看的IL中的约束:)请参见我的项目以获取示例。您应该只使用typeof(T)
和typeof(Y)
-这些将为您提供实际的泛型类型参数。在这里使用反射没有任何好处:它速度慢并且给出错误的答案!据我所知,泛型类型参数在执行时根本不可用于反射。特别是,您当前调用的方法()明确说明您的方法不起作用:
如果当前执行的方法是泛型方法,GetCurrentMethod
返回泛型方法定义
(换句话说,没有指定类型参数的版本-它只知道您有t
和Y
,但不知道它们是什么。)
因此,只要摆脱循环,使用:
CheckTypeIsEnum(typeof(T));
CheckTypeIsEnum(typeof(Y));
还要注意的是,有了一点IL黑客技术,您就可以有一个约束条件其中T:enum
。它不是有效的C#,但它是有效的IL,并且C#编译器遵守它所查看的IL中的约束:)查看我的项目以获取示例。我明确没有要求类型(T)
。如果可能的话,我想要反射。不过你链接到的项目看起来很有趣。@Mikedklerk:你为什么不想要typeof(t)
?这会给你一个正确的答案,而反射根本不会……因为当你得到一个通用的方法定义(这是你从GetCurrentMethod
得到的)根本没有任何泛型类型参数。请使用有效的解决方案:)@Mikedklerk:我已经添加了有关当前方法不起作用的更多信息。感谢您的补充说明。我只是为带有6个泛型参数的函数编写了额外的行。我以为我找不到它。但您声明它不可能看到你的技术背景,我想我不必再看了,因为这是不可能的(在VS中按原样使用C)@mikedklerk:如果你在多个地方都有这样的功能,你可以用不同数量的类型参数编写助手方法,只验证它们,例如调用validatenums
或validatenums
。这样至少不会使代码混乱。我明确没有要求typeof(t)
。如果可能的话,我想要反射。不过你链接到的项目看起来很有趣。@Mikedklerk:你为什么不想要typeof(t)
?这会给你一个正确的答案,而反射根本不会……因为当你得到一个通用的方法定义(这是你从GetCurrentMethod
得到的)根本没有任何泛型类型参数。请使用有效的解决方案:)@Mikedklerk:我已经添加了有关当前方法不起作用的更多信息。感谢您的补充说明。我只是为带有6个泛型参数的函数编写了额外的行。我以为我找不到它。但您声明它不可能看到你的技术背景,我想我不必再看了,因为这是不可能的(在VS中按原样使用C)@mikedklerk:如果你在多个地方都有这样的方法,你可以用不同数量的类型参数来编写助手方法,只验证它们,例如调用validatenums
或validatenums
。这样至少它不会把代码弄得乱七八糟。