如何从反射上下文调用泛型方法

本文关键字:调用 泛型方法 上下文 反射 | 更新日期: 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),如果有这样的可用替代方案,我个人会避免反思。