在c#中,是否有可能用属性装饰Enum类型或做一些其他事情来指定默认值应该是什么,而不改变值?由于某种原因,所需的数字可能是固定不变的,而且仍然可以控制默认值是很方便的。
enum Orientation
{
None = -1,
North = 0,
East = 1,
South = 2,
West = 3
}
Orientation o; // Is 'North' by default.
在c#中,是否有可能用属性装饰Enum类型或做一些其他事情来指定默认值应该是什么,而不改变值?由于某种原因,所需的数字可能是固定不变的,而且仍然可以控制默认值是很方便的。
enum Orientation
{
None = -1,
North = 0,
East = 1,
South = 2,
West = 3
}
Orientation o; // Is 'North' by default.
当前回答
如果你将默认enum定义为最小值的enum,你可以使用这个:
public enum MyEnum { His = -1, Hers = -2, Mine = -4, Theirs = -3 }
var firstEnum = ((MyEnum[])Enum.GetValues(typeof(MyEnum)))[0];
firstEnum == Mine.
这并没有假设枚举值为零。
其他回答
如果0不是合适的默认值,你可以使用组件模型为枚举定义一个变通方法:
[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#语言默认值,但提供了一种方法来指示(并获得)所需的默认值。
还有一种方法可能会有帮助——使用某种“别名”。 例如:
public enum Status
{
New = 10,
Old = 20,
Actual = 30,
// Use Status.Default to specify default status in your code.
Default = New
}
[DefaultValue(None)]
public enum Orientation
{
None = -1,
North = 0,
East = 1,
South = 2,
West = 3
}
然后在代码中可以使用
public Orientation GetDefaultOrientation()
{
return default(Orientation);
}
枚举类型的默认值为0:
默认情况下,第一个枚举数的值为0,值为 每个连续的枚举数加1。” 值类型enum包含表达式(E)0产生的值,其中E是enum 标识符”。
你可以在这里查看c#枚举的文档和c#默认值表的文档。
枚举的默认值是等于0的枚举值。我不相信这可以通过属性或其他方式改变。
(MSDN说:“enum E的默认值是表达式(E)0产生的值。”)