2016-10-11 1 views
-1

Редактировать: я обновил сообщение, чтобы использовать 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. Если я не могу этого сделать, я подумал, что могу сделать конструктор с дополнительными параметрами. Есть ли простой способ настроить это?

ответ

0

Простите меня, если я не понимаю некоторые детали вашего сценария, но если свойство AnimalId атрибута Animal всегда будет равным значению int элемента Enum, то не является ли атрибут Animal ненужным? Не могли бы вы сделать следующее:

Enum:

public enum AnimalType 
{ 
    Bear = 0, 
    Cat = 1, 
    Dog = 2 
} 

Чтобы получить значение INT просто бросить перечисление:

int animalVal = (int)AnimalType.Bear; 

Чтобы получить название животного по значению:

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

Да, вы правы, это моя ошибка.Я составил этот пример, потому что я не хочу давать то, с чем я работаю. Идентификатор, с которым я работаю, - это Guid, поэтому он необходим. См. Мой комментарий к ответу выше для более подробного разъяснения. – Drew

+0

@Drew Я процитировал ваши комментарии выше для уточнения. Поскольку у вас нет доступа к Руководству, соответствующему животному, почему бы вам просто не украсить каждое перечисление атрибутом описания, который содержит имя животного? Тогда вы можете получить перечисления таким образом. – Dave

1

Не уверен, что вы за цель, но вы можете быть более усложняющим это. Не имеет смысла использовать перечисление с его значением int, а затем определить атрибут с другим значением int.

Вместо этого используйте вместо этого атрибут DescriptionAttribute. Он встроен и будет делать то, что вам нужно.

Заканчивать Getting attributes of Enum's value

+0

К сожалению, я, возможно, отказался от того, с чем я действительно работаю, поскольку этот пример на самом деле немного отличается. Int id - фактически Guid, поэтому он необходим. Так что в основном мой вопрос: я хочу получить значение перечисления с помощью Guid или атрибута name/description - это возможно? Имеет ли это смысл? – Drew

+0

** ОписаниеAttribute ** все равно будет работать. Вы руководство - это просто строка, так что это может быть описание. Я сомневаюсь в вашей конечной цели. Почему бы не использовать интерфейс или абстрактный тип животных и не держать там Guid? –

+0

Думаю, я все еще немного смущен. Может быть, немного больше фона того, с чем я действительно работаю, поможет. Я разбираю XmlDocument, и в этом документе у меня есть доступ к имени животного (который не соответствует именам перечислений, поэтому я не могу использовать 'Enum.TryParse'). У меня нет доступа к Гиду, соответствующему животному. Поэтому, даже если Guid может быть описанием, это не помогает мне получить значение перечисления. Что касается вашего второго момента, я просто работаю с кодом, который мне дал. Я не хочу его менять, потому что другие вещи полагаются на него, но я могу добавить к нему. – Drew