C# 选择枚举类型的默认值而不必更改值

C# 选择枚举类型的默认值而不必更改值,c#,.net,enums,C#,.net,Enums,在C#中,是否可以使用属性修饰枚举类型,或者执行其他操作来指定默认值,而不必更改值?无论出于何种原因,所需的数字都可能是一成不变的,并且仍然可以控制默认值是很方便的 enum Orientation { None = -1, North = 0, East = 1, South = 2, West = 3 } Orientation o; // Is 'North' by default. enum(实际上,任何值类型)的默认值都是0——即使这不是该e

在C#中,是否可以使用属性修饰枚举类型,或者执行其他操作来指定默认值,而不必更改值?无论出于何种原因,所需的数字都可能是一成不变的,并且仍然可以控制默认值是很方便的

enum Orientation
{
    None = -1,
    North = 0,
    East = 1,
    South = 2,
    West = 3
}

Orientation o; // Is 'North' by default.

enum
(实际上,任何值类型)的默认值都是0——即使这不是该
enum
的有效值。它不能更改。

枚举的默认值是枚举等于零的值。我不相信这是可以通过属性或其他方式改变的


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

实际上
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;
public enum MyEnum{His,Hers,Mine,Theirs}

Enum.GetValues(typeOf(MyEnum)).GetValue(0);
public enum Status
{
    New = 10,
    Old = 20,
    Actual = 30,

    // Use Status.Default to specify default status in your code. 
    Default = New 
}

你不能,但如果你愿意,你可以做些小动作。:)

将此结构用作简单枚举。
默认情况下,您可以在其中创建p.a==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
#区域转换数量
私人国际旅行社;
静态字典dict=null;
公众导向(int val)
{
this.val=val;
}
公共静态隐式运算符方向(int值)
{
返回新方向(值-1);
}
公共静态布尔运算符==(方向a、方向b)
{
返回a.val==b.val;
}
公共静态布尔运算符=(方向a、方向b)
{
返回a.val!=b.val;
}
公共重写字符串ToString()
{
if(dict==null)
初始化法令();
if(dict.ContainsKey(val))
返回dict[val];
返回值ToString();
}
私人无效初始法令()
{
dict=新字典();
foreach(GetType().GetFields(BindingFlags.Public | BindingFlags.Static)中的变量字段)
{
dict.Add(((方向)fields.GetValue(null)).val,fields.Name);
}
} 
#端区

任何枚举的默认值都是零。因此,如果要将一个枚举数设置为默认值,则将该枚举数设置为零,并将所有其他枚举数设置为非零(如果有多个枚举数的值为零,则第一个值为零的枚举数将是该枚举的默认值)

如果您的枚举数不需要显式值,则只需确保第一个枚举数是您希望作为默认枚举数的枚举数,因为“默认情况下,第一个枚举数的值为0,每个后续枚举数的值增加1。”()

然后在代码中可以使用

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

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

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;
public enum MyEnum{His,Hers,Mine,Theirs}

Enum.GetValues(typeOf(MyEnum)).GetValue(0);
public enum Status
{
    New = 10,
    Old = 20,
    Actual = 30,

    // Use Status.Default to specify default status in your code. 
    Default = New 
}

这将返回
His

如果零不是正确的默认值,您可以使用组件模型为枚举定义一个变通方法:

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

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

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

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;
public enum MyEnum{His,Hers,Mine,Theirs}

Enum.GetValues(typeOf(MyEnum)).GetValue(0);
public enum Status
{
    New = 10,
    Old = 20,
    Actual = 30,

    // Use Status.Default to specify default status in your code. 
    Default = New 
}

枚举的默认值是等于0的枚举成员或第一个元素(如果未指定值)
。。。但是我在我的项目中使用enum时遇到了一些关键问题,并且通过做下面的事情来克服这些问题。。。我的需求与班级水平有多大关系

    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
现在,如果值来自DB。。。。好的,在这个场景中。。。在下面的函数中传递值,它会将该值转换为enum…下面的函数处理各种场景,它是通用的。。。相信我,它非常快……:)

public static T ToEnum(此对象值)
{
//检查值为null或DBNull
如果(!value.IsNull())
{
返回(T)Enum.Parse(typeof(T),value.ToStringX());
}
//可回收物
对象值返回=null;
//首先检查是否存在任何“DefaultValueAttribute”
var DefaultAtt=(来自typeof(T).CustomAttributes中的a
其中a.AttributeType==typeof(DefaultValueAttribute)
选择a).FirstOrNull();
//如果存在DefaultAttributeValue
如果((!DefaultAtt.IsNull())&&(DefaultAtt.ConstructorArguments.Count==1))
{
ValueToReturn=DefaultAtt.ConstructorArguments[0]。值;
}
//如果仍然没有找到值
if(ValueToReturn.IsNull())
{
//正在尝试获取该枚举的第一个属性
数组值=Enum.GetValues(typeof(T));
//正在获取此枚举的第一个成员
如果(value.Length>0)
{
ValueToReturn=Values.GetValue(0);
}
}
//如果发现任何结果
如果(!ValueToReturn.IsNull())
{
return(T)Enum.Parse(typeof(T),ValueToReturn.toString();
}
返回默认值(T);
}

枚举类型的默认值为0:

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

  • 值类型enum具有表达式(E)0生成的值,其中E是enum 标识符。”


您可以查看C#enum的文档以及C#default values表的文档。

如果您将默认枚举定义为具有最小值的枚举,则可以使用以下方法:

public enum MyEnum { His = -1, Hers = -2, Mine = -4, Theirs = -3 }

var firstEnum = ((MyEnum[])Enum.GetValues(typeof(MyEnum)))[0];

firstEnum == Mine.
这并不假定枚举具有零值

enum Orientations
{
    None, North, East, South, West
}
private Orientations? _orientation { get; set; }

public Orientations? Orientation
{
    get
    {
        return _orientation ?? Orientations.None;
    }
    set
    {
        _orientation = value;
    }
}
如果将属性设置为null,则将返回方向。get上无。 属性_方向为空
enum Orientations
{
    None, North, East, South, West
}
private Orientations? _orientation { get; set; }

public Orientations? Orientation
{
    get
    {
        return _orientation ?? Orientations.None;
    }
    set
    {
        _orientation = value;
    }
}