2009-12-18 85 views
14

我可以聲明C#enumbool像:C#枚舉可以聲明爲bool類型嗎?

enum Result : bool 
{ 
    pass = true, 
    fail = false 
} 
+18

僅當您添加第三個值,FileNotFound – blu

+0

即使有可能,我不認爲這爲任何東西,但令人困惑。 '如果(!IsFailed){...}'完全不可讀。 –

+1

說'bool success = Result.Pass'而不是'bool success = true'有什麼好處?這是一個可讀性的東西嗎? –

回答

17

如果您需要枚舉包含除枚舉常量的類型值布爾數據,你可以簡單的屬性添加到您的枚舉,取一個布爾值。然後,您可以爲您的枚舉添加一個擴展方法,以獲取該屬性並返回其布爾值。

public class MyBoolAttribute: Attribute 
{ 
     public MyBoolAttribute(bool val) 
     { 
      Passed = val; 
     } 

     public bool Passed 
     { 
      get; 
      set; 
     } 
} 

public enum MyEnum 
{ 
     [MyBoolAttribute(true)] 
     Passed, 
     [MyBoolAttribute(false)] 
     Failed, 
     [MyBoolAttribute(true)] 
     PassedUnderCertainCondition, 

     ... and other enum values 

} 

/* the extension method */  
public static bool DidPass(this Enum en) 
{ 
     MyBoolAttribute attrib = GetAttribute<MyBoolAttribute>(en); 
     return attrib.Passed; 
} 

/* general helper method to get attributes of enums */ 
public static T GetAttribute<T>(Enum en) where T : Attribute 
{ 
     Type type = en.GetType(); 
     MemberInfo[] memInfo = type.GetMember(en.ToString()); 
     if (memInfo != null && memInfo.Length > 0) 
     { 
      object[] attrs = memInfo[0].GetCustomAttributes(typeof(T), 
      false); 

      if (attrs != null && attrs.Length > 0) 
       return ((T)attrs[0]); 

     } 
     return null; 
} 
20

它說

經批准的類型枚舉是字節,爲sbyte,短,USHORT,INT,UINT,長,或烏龍

enum (C# Reference)

6

什麼:

class Result 
    { 
     private Result() 
     { 
     } 
     public static Result OK = new Result(); 
     public static Result Error = new Result(); 
     public static implicit operator bool(Result result) 
     { 
      return result == OK; 
     } 
     public static implicit operator Result(bool b) 
     { 
      return b ? OK : Error; 
     } 
    } 

您可以使用它像枚舉或類似BOOL,例如 變種X = Result.OK; 結果y = true; 如果(X)... 或 如果(Y == Result.OK)