如何检测传递给 Enum[] 的枚举类型

How to detect enum type passed to Enum[]

在我的 MVC 项目中我有 MyEnum:

public enum MyEnum
{
    a,
    b,
    c,
    d
}

我也有class:

public class MyClass
{    
    public MyEnum SelectType { get; set; }

    public Enum[] NotSupportedTypes{ get; set; }
}

在我的 class for NotSupportedTypes 中,我只能使用 Enum[] 类型。

当我创建 class MyClass 的对象时,如何检查 NotSupportedTypes 中是否仅推送 MyEnum 类型的枚举?

var model = new MyClass();

//good
model.NotSupportedTypes = new Enum[] { MyEnum.a }

//bad
model.NotSupportedTypes = new Enum[] { SomeOtherEnum.a }
var model = new MyClass();

//good
//model.NotSupportedTypes = new Enum[] { MyEnum.a }

//bad
model.NotSupportedTypes = new Enum[] { SomeOtherEnum.a }

var validTypes = model.NotSupportedTypes.All(n => n.GetType() == typeof(MyEnum));

您可以在 属性 中检查它,例如 Array.TrueForAll:

private Enum[] _NotSupportedTypes;
public Enum[] NotSupportedTypes
{
    get { return _NotSupportedTypes; }
    set {
        if (!Array.TrueForAll(value, x => x.GetType() == typeof(MyEnum)))
            throw new ArgumentException("All enums must be MyEnum");
        _NotSupportedTypes = value; 
    }
}

如 Xanatos 所述,这不会保护您免受数组更改的影响。所以你可以稍后用不同的枚举类型替换其中的一个 MyEnum 。数组不是只读的。

那你为什么不首先使用 MyEnum[]