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
。这样至少它不会把代码弄得乱七八糟。