2015-09-23 216 views
1

我有一个类:覆盖在继承类的自定义枚举枚举

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而不是空白Enum 字段。但上面的代码不起作用,并且不接受 字段的MyFieldsEnum。 它给出的错误:“类型必须是枚举匹配被覆盖的成员Criteria.Field”

它可能以某种方式或其他?

+0

你能使用泛型吗? –

+3

“不起作用”是*从来没有足够的信息。发生什么事与你想要发生什么? (但不,你不能用一个不同类型的属性覆盖一个类型的属性。) –

+0

@JonSkeet谢谢。我想要实现的是:我想要一个基类,但继承的类将实现它们自己的Enum版本。有没有办法实现这一点? – Satyajit

回答

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

+0

谢谢。我如何将字段值作为实现代码中的枚举来读取? – Satyajit

+0

@Satyajit听起来像一个单独的问题! –

1

因为你不能从基类重写Enum可以使用generics而是用普通的约束,因为Enum是一个structIConvertible另外,请阅读到底)注:

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; 
     } 
    } 
} 

另一种方式是在运行时检查这一点,但这样更危险,并会使用此类知道从get方法返回的Enum是要求开发3210:

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作为抽象类型,因为如果你想想看,这将参考Criteriaabstract class任何代码都知道,实际Enum你正在使用,以便做一些事情,所以你最好是安全的,并重新考虑,如果这种抽象真的给你带来好处