我的数据库中有enums
,如下所示:
“Random Type”,“Random Type1”,“NewRandom”
通常,我会在枚举中表示值:
enum myTypes
{
Random Type = 0,...
}
但这是不可能的,所以我尝试使用类
static class myTypes
{
public const string RandomType = "Random Type";
public const string NewRandom = "NewRandom";
}
这样,我可以像Enum
那样使用类,但我想知道这是否是最好的实现?或者是否在创建Enums
以允许空间?
感谢。
修改 拜托,我也想知道我目前的实施是否有任何问题。我觉得我目前的实施方式比大多数建议的解决方案更好。
由于
答案 0 :(得分:3)
不,你不能这样做。枚举只是类型安全的int
。
有一个可用的解决方案,我非常喜欢它。使用DescriptionAttribute。
你会这样使用它:
static enum myTypes
{
[Description("Random Type")]
RandomType,
[Descripton("New Random")]
NewRandom
}
然后你还需要这个扩展方法:
public static string GetDescription<T>(this T en) where T : struct, IConvertible
{
Type type = typeof(T);
if (!type.IsEnum)
{
throw new ArgumentException("The type is not an enum");
}
MemberInfo[] memInfo = type.GetMember(en.ToString());
if (memInfo != null && memInfo.Length > 0)
{
object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attrs != null && attrs.Length > 0)
{
return ((DescriptionAttribute)attrs[0]).Description;
}
}
return en.ToString();
}
然后,你可以这样做:
myTypes.RandomType.GetDescription();
答案 1 :(得分:2)
枚举与数字(特别是整数)非常相似,而不是字符串左右。坚持使用编号的枚举可以轻松进行投射,标记合成(例如AND,OR等)。
我不会使用字符串常量来代替枚举,除非这会给你带来比惩罚更多的好处。
如果您的目标是向用户描述枚举选项,我建议您考虑使用Description属性来丰富每个项目。它是元数据,而不是真实的数据,但使用反射也很容易阅读。
干杯
答案 2 :(得分:2)
我所做的是定义可以附加到枚举值的自定义属性[DisplayName(string)]
。您可以在希望用空格/特殊字符命名的值上定义带有显示名称的枚举:
public enum Test
{
None = 0,
[DisplayName("My Value")]
MyValue = 1,
[DisplayName("Spęćiał")]
Special = 2
}
除了获取枚举值名称之外,您的实现还应该检查是否设置了DisplayName
属性,如果是,则应该使用显示名称。
答案 3 :(得分:1)
我会使用显示名称属性:
[AttributeUsage(AttributeTargets.Field)]
public class EnumDisplayNameAttribute : DisplayNameAttribute
{
public EnumDisplayNameAttribute()
: base(string.Empty)
{
}
public EnumDisplayNameAttribute(string displayName)
: base(displayName)
{
}
}
public static class EnumExtensions
{
public static string ToDisplayName(this Enum enumValue)
{
var builder = new StringBuilder();
var fields = GetEnumFields(enumValue);
if (fields[0] != null)
for (int i = 0; i < fields.Length; i++)
{
var value = fields[i]
.GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)
.OfType<EnumDisplayNameAttribute>()
.FirstOrDefault();
builder.Append(value != null
? value.DisplayName
: enumValue.ToString());
if (i != fields.Length - 1)
builder.Append(", ");
}
return builder.ToString();
}
private static FieldInfo[] GetEnumFields(Enum enumValue)
{
var type = enumValue.GetType();
return enumValue
.ToString()
.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)
.Select(type.GetField)
.ToArray();
}
}
用于类型:
public enum MyType
{
[DisplayName("Random Type")]
RandomType,
[DisplayName("New Random")]
NewRandom
}
将是:
var enumVariable = MyType.RandomType;
var stringRepresentation = enumVariable.ToDisplayName();
请注意,使用该方法,如果省略某些枚举成员的属性,则会获得ToString值。
答案 4 :(得分:0)
您可能不在数据库中使用字符串作为类型指示符。改为使用整数。如果您愿意,可以在数据库中使用“类型表”,您可以在其中存储类型名称,而不是通过使用它们的表重复它们。
如果这样做,那么您可以按照上面的建议将数据库中的整数转换为枚举。
答案 5 :(得分:0)
您可以使用Typesafe Enum模式来实现目标。
想法是将你的枚举包装在一个类中。我想这就是你想要的 -
public class MyTypes
{
#region Enum Values
public static MyTypes RandomType = new MyTypes(0, "Random Type");
public static MyTypes NewRandom = new MyTypes(1, "New Random");
#endregion
#region Private members
private int id;
private string value;
private MyTypes(int id, string value)
{
this.id = id;
this.value = value;
}
#endregion
#region Overriden members
public override string ToString()
{
return value;
}
#endregion
public static List<MyTypes> GetValues()
{
return new List<MyTypes>() { MyTypes.RandomType, MyTypes.NewRandom };
}
}