1

我有一个Constraints对象,它将获得其他对象必须遵守的一组规则。

constraints有一个方法叫做GetEnumValueRange<T>()whereT是 Enum 的一种类型。

因此,例如,我可以将枚举定义为:

[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>(); 

但显然不是

4

2 回答 2

2

您可能需要通过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);

    // ...
}
于 2012-08-08T11:38:32.333 回答
1

为什么不做一个GetEnumValueRangeType参数的重载,所以你最终会得到这样的结果:

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),如果有这样的可用替代方案,我个人会避免反思。

于 2012-08-08T11:46:13.293 回答