如何使用两个属性值之一获取枚举值

时间:2016-10-11 00:38:37

标签: c# enums attributes

修改:我更新了帖子以使用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作为stringGuid接受。 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。如果我不能这样做那么我认为我可以用可选参数制作构造函数。有没有简单的方法来设置它?

2 个答案:

答案 0 :(得分:1)

不确定你的目标是什么,但你可能会因此而复杂化。使用具有 int 值的枚举然后定义具有不同 int 值的属性是没有意义的。

请查看使用DescriptionAttribute。它是内置的,可以满足您的需求。

查看Getting attributes of Enum's value

答案 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);