2015-09-23 130 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你正在使用,以便做一些事情,所以你最好是安全的,並重新考慮,如果這種抽象真的給你帶來好處