如何从反射上下文调用泛型方法
本文关键字:调用 泛型方法 上下文 反射 | 更新日期: 2024-11-03 18:47:07
我有一个Constraints
对象,它将获得一组其他对象必须遵守的规则。
constraints
有一个名为GetEnumValueRange<T>()
的方法,其中T
是一种枚举。
例如,我可以将枚举定义为:
[Flags]
public enum BoxWithAHook
{
None = 0,
Thing1 = 1,
Thing2 = 2,
...
// lots of other things that might be in the box
ThingN = N
}
然后,我可以获得一系列在给定上下文中有效的值BoxWithAHook
:
var val = constraints.GetEnumValueRange<BoxWithAHook>();
问题是我试图使用反射来做这项工作。我无法指定该类型是否BoxWithAHook
,因为它可以是扩展Enum
的任何内容。这是我拥有的一个例子:
if (propertyInfo.PropertyType.BaseType == typeof(Enum))
{
var val = constraints.GetEnumValueRange<>(); // what is the generic type here?
// now I can use val to get the constraint values
}
我可以指定泛型类型吗? 理想情况下,这将起作用:
constraints.GetEnumValueRange<propertyInfo.PropertyType>();
但显然没有
您可能需要
通过此处的MethodInfo
进行一些反思:
if (propertyInfo.PropertyType.BaseType == typeof(Enum))
{
MethodInfo method = typeof(Constraints).GetMethod("GetEnumValueRange");
MethodInfo genericMethod = method.MakeGenericMethod(propertyInfo.PropertyType);
var val = genericMethod.Invoke(constraints, null);
// ...
}
为什么不重载一个GetEnumValueRange
,它需要一个Type
参数,所以你最终得到这样的东西:
public class Constraints
{
public IEnumerable GetEnumValueRange(Type enumType)
{
// Logic here
}
public IEnumerable<T> GetEnumValueRange<T>()
{
return GetEnumValueRange(typeof(T)).Cast<T>();
}
}
然后你可以简单地使用constraints.GetEnumValueRange(propertyInfo.PropertyType)
,如果有这样的可用替代方案,我个人会避免反思。