是否可以将自定义属性添加到c#enum对象?
使用c#是否可以使用关联每个枚举项的属性 我使用了将英文描述添加到是否可以将自定义属性添加到c#enum对象?,c#,enums,system.componentmodel,C#,Enums,System.componentmodel,使用c#是否可以使用关联每个枚举项的属性 我使用了将英文描述添加到enum项中 为了给每个项目添加英文描述,我做了以下工作 public enum MyEnum { [Description("My First Item")] First, [Description("My Second Item")] Second, [Description("My Third Item")] Third } 然后我在我的enum中添加了一个名为GetDe
enum
项中
为了给每个项目添加英文描述,我做了以下工作
public enum MyEnum
{
[Description("My First Item")]
First,
[Description("My Second Item")]
Second,
[Description("My Third Item")]
Third
}
然后我在我的enum
中添加了一个名为GetDescription()
的扩展方法,它允许我像这样获得描述
public static string GetDescription(this Enum value)
{
Type type = value.GetType();
string name = Enum.GetName(type, value);
if (name != null)
{
FieldInfo field = type.GetField(name);
if (field != null)
{
DescriptionAttribute attr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
if (attr != null)
{
return attr.Description;
}
}
}
return name;
}
但是,如果我能够分配一个类或构造一个新对象,这将对我有很大帮助
我可以/怎么做像下面这样的事情
public enum MyEnum
{
[Description("My First Item"), new { IsFirst = true, UnitType = 1}]
First
}
或者使用一个类
public enum MyEnum
{
[Description("My First Item"), new MyCustomClass(true, 1)]
First
}
您可以为此创建另一个扩展方法
public static object Create(this MyEnum enum)
{
switch (enum)
{
case MyEnum.First:
return new { IsFirst = true, UnitType = 1}];
case MyEnum.Second:
return new ...
default:
...
}
}
然后像这样使用它:
dynamic first = MyEnum.First.Create();
var isFirst = first.IsFirst;
<强>但您确实应该考虑创建一个工厂来创建您的对象。
您可以用自定义属性来装饰元素。这些可以包含你想要的任何东西[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
public class DescriptorAttribute : Attribute
{
public bool IsFirst { get; }
public int UnitType { get; }
public DescriptorAttribute(bool isFirst, int unitType)
{
IsFirst = isFirst;
UnitType = unitType;
}
}
您将按如下方式使用此选项:
public enum Test
{
[Descriptor(isFirst: true, unitType: 2)]
Element
}
您已经有了在问题中读取此属性的代码。您可以。此时,您不应该只使用多态性而不使用枚举吗?枚举本质上是整数,如果要存储整数、字符串和类,请使用
Tuple Tuple=new Tuple(1,“第一项”,new MyCustomClass(true,1))代码>@Pierre Luccinoult你能举个例子说明怎么做吗?@MikeA如果其中一个答案解决了你的问题,请将其标记为已解决。如果没有,请澄清现有答案中仍然缺少的内容。