C# 选择枚举类型的默认值而不必更改值
在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
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;
}
}