gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:29:59 25 4
gpt4 key购买 nike

我有这个通用方法,我想确保指定的类型是枚举。现在我明白我不能做类似 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);

问题是 methodInfo.GetGenericArguments() 返回的类型不是我指定的枚举类型。但它们的类型是 TY 以及 BaseType: {Name = "ValueType"FullName = "System.ValueType"}

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

附言.Net 4.5

最佳答案

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

If the currently executing method is a generic method, GetCurrentMethod returns the generic method definition.

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

所以只要摆脱你的循环,然后使用:

CheckTypeIsEnum(typeof(T));
CheckTypeIsEnum(typeof(Y));

另请注意,使用一些 IL 黑客技术,您可以具有 where T : enum 的约束。它不是有效的 C#,但它是有效的 IL,并且 C# 编译器遵守它正在查看的 IL 中的约束 :) 请参阅我的 Unconstrained Melody项目为例。

关于c# - 如何获取数组中方法中使用的泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24416187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com