在继承的类中使用自定义枚举覆盖枚举

时间:2015-09-23 16:22:06

标签: c# inheritance enums

我有一个班级:

public abstract class Criteria
{
    public virtual Enum Field
    {
        get; set;
    }
    public string FieldData;
}

我有一个枚举:

public enum MyFieldsEnum
{
    Name=1,
    Age=2,
    Gender=3,
}

我有一个继承的类:

public class MyCriteria : Criteria
{
    MyFieldsEnum myfields;
    public override MyFieldsEnum Field
    {
        get
        {
            return myfields;
        }

        set
        {
            base.Field = value;
        }
    }
}

想法是返回MyFieldsEnum而不是空白枚举 领域。但上面的代码不起作用,也不接受 MyFieldsEnum for Field。 它给出错误:"类型必须是枚举以匹配被覆盖的成员Criteria.Field"

是否可能以某种方式或其他方式?

2 个答案:

答案 0 :(得分:3)

我的投票是将其更改为使用泛型。

public abstract class Criteria<TEnum>
   where TEnum : struct, IConvertable
{
     public T Field { get; set; }
}

public class MyCriteria : Criteria<MyFieldsEnum>
{
   // No need to override Field
}

警告C#/ CLR目前不支持enum作为类型约束。你可以做你想做的事,但这里有更多的信息:Create Generic method constraining T to an Enum

答案 1 :(得分:1)

由于您无法覆盖基类中的Enum,因此您可以使用generics来使用通用约束,因为EnumstructIConvertible另外,请阅读最后的说明):

public abstract class Criteria<T> where T : struct, IConvertible
{
    public virtual T Field
    {
        get; set;
    }
    public string FieldData;
}

public class MyCriteria : Criteria<MyFieldsEnum>
{
    MyFieldsEnum myfields;
    public override MyFieldsEnum Field
    {
        get
        {
            return myfields;
        }

        set
        {
            base.Field = value;
        }
    }
}

其他方法是在运行时检查这个,但这样做风险更大,并且需要使用此类的开发人员知道Enum方法返回的getMyFieldsEnum:< / p>

public class MyCriteria : Criteria
{
    MyFieldsEnum myfields;
    public override Enum Field
    {
        get
        {
            return myfields;
        }

        set
        {
            if (!(value is MyFieldsEnum))
            {
                throw new InvalidOperationException("Cannot set enums other than MyFieldsEnum");
            }
            base.Field = value;
        }
    }
}

注意:无论如何,在您这样做之前,您应该重新考虑Enum作为您的抽象类型,因为如果您考虑它,任何将Criteria称为{{abstract class的代码1}}必须知道您正在使用的实际Enum才能做某事,所以如果这种抽象确实给你带来任何好处,你最好是安全的并重新考虑