Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用两个属性值之一获取枚举值_C#_Enums_Attributes - Fatal编程技术网

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

C# 如何使用两个属性值之一获取枚举值,c#,enums,attributes,C#,Enums,Attributes,编辑:我更新了帖子,使用Guid而不是int。感谢下面指出使用int没有任何作用的人,因为枚举的基本类型是int 我有一个枚举,假设它是 public enum AnimalType { [Animal("00000000000000000000000000000001")] Bear = 0, [Animal("00000000000000000000000000000002")] Cat = 1, [Animal("0000000000000000

编辑:我更新了帖子,使用
Guid
而不是
int
。感谢下面指出使用
int
没有任何作用的人,因为枚举的基本类型是
int

我有一个枚举,假设它是

public enum AnimalType
{
    [Animal("00000000000000000000000000000001")]
    Bear = 0,

    [Animal("00000000000000000000000000000002")]
    Cat = 1,

    [Animal("00000000000000000000000000000003")]
    Dog = 2
}
此枚举使用动物属性,定义为:

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作为
字符串或
Guid
AnimalType
enum使用
string
构造函数

因此,到目前为止,只能通过知道id来访问枚举值。假设我不知道与特定枚举值对应的id,我也可以使用与每个枚举值对应的名称/描述来访问枚举值(可能只是“Bear”表示Bear,等等)。我的问题是,如何设置它,使
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
。如果我做不到这一点,那么我想我可以用可选参数构造构造函数。有没有一种简单的方法来设置它?

如果我误解了您场景的一些细节,请原谅,但是如果动物属性的AnimalId属性总是等于Enum元素的int值,那么动物属性不是没有必要吗?难道你就不能做到以下几点:

枚举:

public enum AnimalType
{
    Bear = 0,
    Cat = 1,
    Dog = 2
}
要获取int值,只需强制转换枚举:

int animalVal = (int)AnimalType.Bear;
要按值获取动物名称,请执行以下操作:

string animalName = Enum.GetName(typeof(AnimalType), 0);

不确定你的目标是什么,但你可能把它复杂化了。将枚举与其int值一起使用,然后用不同的int值定义属性是没有意义的

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


看看

Oops,我可能已经简化了我实际使用的内容,以至于这个示例实际上略有不同。int id实际上是一个Guid,这就是为什么它是必需的。所以基本上我的问题是,我想得到一个带有Guid或name/description属性的枚举的值——这可能吗?这有意义吗?DescriptionAttribute仍然有效。您的guid只是一个字符串,因此可以是描述。但我怀疑你的最终目标。为什么不使用接口或抽象类型的Animal,并将Guid保留在那里呢?我想我还是有点困惑。也许多了解一下我的实际工作背景会有所帮助。我正在解析一个XmlDocument,在此文档中我可以访问动物名称(它与枚举名称不直接对应,因此我不能使用
enum.TryParse
)。我无权访问与动物对应的Guid。因此,即使Guid可以是描述,也无法帮助我获取枚举值。至于你的第二点,我只是在处理别人给我的代码。我不想改变它,因为其他东西依赖它,但我可以添加到它。是的,你是对的,这是我的错误。我编这个例子是因为我不想给出我正在处理的实际情况。我实际使用的id是Guid,这就是为什么它是必需的。请参阅我对上述答案的评论,以获得更多澄清。@Drew我已参考您对上述答案的评论进行澄清。既然您无权访问对应于动物的Guid,为什么不使用包含动物名称的description属性来修饰每个枚举?这样就可以得到枚举。