Редактировать: я обновил сообщение, чтобы использовать 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
.
Так что теперь значение перечислимого типа можно получить только зная идентификатор. Предположим, что, если я не знаю идентификатора, соответствующего определенному значению перечисления, я также могу получить доступ к значениям перечисления, используя некоторое имя/описание, соответствующее каждому значению перечисления (возможно, только «Медведь» для Медведя и т. Д.). Мой вопрос заключается в том, как установить это, так что AnimalAttribute
может принимать либо идентификатор (и либо как строку, либо 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
. Если я не могу этого сделать, я подумал, что могу сделать конструктор с дополнительными параметрами. Есть ли простой способ настроить это?
Да, вы правы, это моя ошибка.Я составил этот пример, потому что я не хочу давать то, с чем я работаю. Идентификатор, с которым я работаю, - это Guid, поэтому он необходим. См. Мой комментарий к ответу выше для более подробного разъяснения. – Drew
@Drew Я процитировал ваши комментарии выше для уточнения. Поскольку у вас нет доступа к Руководству, соответствующему животному, почему бы вам просто не украсить каждое перечисление атрибутом описания, который содержит имя животного? Тогда вы можете получить перечисления таким образом. – Dave