selectEnumtypes的默认值而不必更改值

在C#中,是否有可能装饰一个属性的Enumtypes或做别的事情来指定默认值应该是什么,而没有改变的价值? 所需的数字可能会出于任何原因而被设置,并且仍然可以控制默认值。

enum Orientation { None = -1, North = 0, East = 1, South = 2, West = 3 } Orientation o; // Is 'North' by default. 

enum的默认值(实际上是任何值types)都是0 – 即使这不是该enum的有效值。 它不能改变。

任何枚举的默认值是零。 所以,如果你想设置一个枚举器为默认值,那么将其设置为零,所有其他枚举器设置为非零(如果有多个枚举器,第一个枚举器的值为零将是该枚举的默认值值为零)。

 enum Orientation { None = 0, //default value since it has the value '0' North = 1, East = 2, South = 3, West = 4 } Orientation o; // initialized to 'None' 

如果您的枚举器不需要明确的值,那么只要确保第一个枚举器是您想成为默认枚举器的那个枚举器,因为“默认情况下,第一个枚举器的值为0,并且每个连续的枚举器的值增加1.” ( C#参考 )

 enum Orientation { None, //default value since it is the first enumerator North, East, South, West } Orientation o; // initialized to 'None' 

如果零不能作为正确的默认值,您可以使用组件模型来为枚举定义一个解决方法:

 [DefaultValue(None)] public enum Orientation { None = -1, North = 0, East = 1, South = 2, West = 3 } public static class Utilities { public static TEnum GetDefaultValue<TEnum>() where TEnum : struct { Type t = typeof(TEnum); DefaultValueAttribute[] attributes = (DefaultValueAttribute[])t.GetCustomAttributes(typeof(DefaultValueAttribute), false); if (attributes != null && attributes.Length > 0) { return (TEnum)attributes[0].Value; } else { return default(TEnum); } } } 

然后你可以打电话给:

 Orientation o = Utilities.GetDefaultValue<Orientation>(); System.Diagnostics.Debug.Print(o.ToString()); 

注意:您需要在文件的顶部包含以下行:

 using System.ComponentModel; 

这不会更改枚举的实际C#语言默认值,但会提供指示(并获取)所需的默认值的方法。

枚举的默认值是任何枚举等于零。 我不相信这是可以通过属性或其他手段来改变的。

(MSDN说:“枚举E的默认值是expression式(E)0产生的值。”)

你不能,但如果你想,你可以做一些伎俩。 🙂

  public struct Orientation { ... public static Orientation None = -1; public static Orientation North = 0; public static Orientation East = 1; public static Orientation South = 2; public static Orientation West = 3; } 

使用这个结构作为简单的枚举。
在这里你可以创buildpa == Orientation.East(或者你想要的任何值)
要使用这个技巧本身,你需要通过代码从int转换。
那里的实现:

  #region ConvertingToEnum private int val; static Dictionary<int, string> dict = null; public Orientation(int val) { this.val = val; } public static implicit operator Orientation(int value) { return new Orientation(value - 1); } public static bool operator ==(Orientation a, Orientation b) { return a.val == b.val; } public static bool operator !=(Orientation a, Orientation b) { return a.val != b.val; } public override string ToString() { if (dict == null) InitializeDict(); if (dict.ContainsKey(val)) return dict[val]; return val.ToString(); } private void InitializeDict() { dict = new Dictionary<int, string>(); foreach (var fields in GetType().GetFields(BindingFlags.Public | BindingFlags.Static)) { dict.Add(((Orientation)fields.GetValue(null)).val, fields.Name); } } #endregion 

还有一种可能有用的方法 – 使用某种“别名”。 例如:

 public enum Status { New = 10, Old = 20, Actual = 30, // Use Status.Default to specify default status in your code. Default = New } 

实际上enum的默认值是enum值为0的第一个元素。

举个例子:

 public enum Animals { Cat, Dog, Pony = 0, } //its value will actually be Cat not Pony unless you assign a non zero value to Cat. Animals animal; 

The default value of enum is the enummember equal to 0 or the first element(if value is not specified) …但我面临的关键问题,在我的项目中使用枚举,并通过做下面的事情克服…我的需要是什么与class级有关…

  class CDDtype { public int Id { get; set; } public DDType DDType { get; set; } public CDDtype() { DDType = DDType.None; } } [DefaultValue(None)] public enum DDType { None = -1, ON = 0, FC = 1, NC = 2, CC = 3 } 

并获得预期的结果

  CDDtype d1= new CDDtype(); CDDtype d2 = new CDDtype { Id = 50 }; Console.Write(d1.DDType);//None Console.Write(d2.DDType);//None 

现在,如果价值来自数据库….好吧,在这种情况下…传递下面的函数的值,它会将值转换为枚举…下面的函数处理各种情况下,它是通用的…并相信我这是非常快 ….. :)

  public static T ToEnum<T>(this object value) { //Checking value is null or DBNull if (!value.IsNull()) { return (T)Enum.Parse(typeof(T), value.ToStringX()); } //Returanable object object ValueToReturn = null; //First checking whether any 'DefaultValueAttribute' is present or not var DefaultAtt = (from a in typeof(T).CustomAttributes where a.AttributeType == typeof(DefaultValueAttribute) select a).FirstOrNull(); //If DefaultAttributeValue is present if ((!DefaultAtt.IsNull()) && (DefaultAtt.ConstructorArguments.Count == 1)) { ValueToReturn = DefaultAtt.ConstructorArguments[0].Value; } //If still no value found if (ValueToReturn.IsNull()) { //Trying to get the very first property of that enum Array Values = Enum.GetValues(typeof(T)); //getting very first member of this enum if (Values.Length > 0) { ValueToReturn = Values.GetValue(0); } } //If any result found if (!ValueToReturn.IsNull()) { return (T)Enum.Parse(typeof(T), ValueToReturn.ToStringX()); } return default(T); } 

默认值是定义中的第一个。 例如:

 public enum MyEnum{His,Hers,Mine,Theirs} Enum.GetValues(typeOf(MyEnum)).GetValue(0); 

这将返回His

枚举types的默认值是0:

  • 默认情况下,第一个枚举数的值为0,每个连续的枚举数的值增加1。

  • 值types枚举具有由expression式(E)0生成的值,其中E是枚举标识符。

您可以在这里查看C#enum的文档,以及C#默认值表的文档。

如果将Default枚举定义为具有最小值的枚举,则可以使用以下命令:

 public enum MyEnum { His = -1, Hers = -2, Mine = -4, Theirs = -3 } var firstEnum = ((MyEnum[])Enum.GetValues(typeof(MyEnum)))[0]; firstEnum == Mine. 

这并不假定枚举有一个零值。

 [DefaultValue(None)] public enum Orientation { None = -1, North = 0, East = 1, South = 2, West = 3 } 

然后在代码中,你可以使用

 public Orientation GetDefaultOrientation() { return default(Orientation); }