在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(实际上,任何值类型)的默认值是0——即使这不是该enum的有效值。这是无法改变的。
其他回答
任何enum的默认值为0。因此,如果您想将一个枚举数设置为默认值,则将该枚举数设置为零,并将所有其他枚举数设置为非零(如果有多个枚举数的值为零,则第一个值为零的枚举数将是该枚举的默认值)。
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'
枚举的默认值是等于0的枚举值。我不相信这可以通过属性或其他方式改变。
(MSDN说:“enum E的默认值是表达式(E)0产生的值。”)
默认值是定义中的第一个。例如:
public enum MyEnum{His,Hers,Mine,Theirs}
Enum.GetValues(typeOf(MyEnum)).GetValue(0);
这将返回他的
如果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#语言默认值,但提供了一种方法来指示(并获得)所需的默认值。
在这种情况下,不要依赖enum值。设None为0作为默认值。
// Remove all the values from the enum
enum Orientation
{
None, // = 0 Putting None as the first enum value will make it the default
North, // = 1
East, // = 2
South, // = 3
West // = 4
}
然后使用一种方法来获得魔数。你可以引入一个扩展方法并像这样使用它:
// Extension Methods are added by adding a using to the namespace
using ProjectName.Extensions;
Orientation.North.ToMagicNumber();
下面是代码:
namespace ProjectName.Extensions
{
public static class OrientationExtensions
{
public static int ToMagicNumber(this Orientation orientation) => oritentation switch
{
case None => -1,
case North => 0,
case East => 1,
case South => 2,
case West => 3,
_ => throw new ArgumentOutOfRangeException(nameof(orientation), $"Not expected orientation value: {orientation}")
};
}
}