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属性来修饰每个枚举?这样就可以得到枚举。