修改:我更新了帖子以使用Guid
代替int
。感谢下面那些指出使用int
并不做任何事情的人,因为枚举的基本类型是int
。
我有一个枚举,让我们说出来
public enum AnimalType
{
[Animal("00000000000000000000000000000001")]
Bear = 0,
[Animal("00000000000000000000000000000002")]
Cat = 1,
[Animal("00000000000000000000000000000003")]
Dog = 2
}
此枚举使用Animal属性,定义为:
public class AnimalAttribute : Attribute
{
public AnimalAttribute(Guid id)
{
this.AnimalId = id;
}
public AnimalAttribute(string id)
{
this.AnimalId = new Guid(id);
}
public Guid AnimalId { get; private set; }
// Some more properties
}
正如您所看到的,AnimalAttribute
有两个构造函数,允许您将ID作为string
或Guid
接受。 AnimalType
枚举使用string
构造函数。
到目前为止,只能通过知道id来访问枚举值。让我们说如果我不知道对应于特定枚举值的id,我也可以使用与每个枚举值对应的某些名称/描述来访问枚举值(可能只是"熊&# 34;对于熊等)。我的问题是,如何设置它以便AnimalAttribute
可以接受id(以及作为字符串或Guid)或与枚举值对应的名称/描述?我想为AnimalAttribute
创建另一个构造函数,如下所示:
public AnimalAttribute(string name)
{
this.AnimalName = name; // assume there is an AnimalName property.
}
然后我可以为每个枚举值添加另一个属性,如下所示:
[Animal("00000000000000000000000000000001")]
[Animal("Bear")]
Bear = 0,
所以我可以提供任何一个值,并且我能够获得枚举值。这样做的问题是我无法使AnimalAttribute
中的构造函数接受string name
,因为已有另一个构造函数接受string id
。如果我不能这样做那么我认为我可以用可选参数制作构造函数。有没有简单的方法来设置它?
答案 0 :(得分:1)
不确定你的目标是什么,但你可能会因此而复杂化。使用具有 int 值的枚举然后定义具有不同 int 值的属性是没有意义的。
请查看使用DescriptionAttribute。它是内置的,可以满足您的需求。
答案 1 :(得分:0)
如果我误解了你的场景的某些细节,请原谅我,但如果Animal属性的AnimalId属性总是等于Enum元素的int值,那么Animal属性是否不必要?你不能做以下事情:
<强>枚举:强>
public enum AnimalType
{
Bear = 0,
Cat = 1,
Dog = 2
}
要获取int值,只需转换枚举:
int animalVal = (int)AnimalType.Bear;
按值获取动物名称:
string animalName = Enum.GetName(typeof(AnimalType), 0);