Разобрать StringValueAttribute, чтобы вернуть Enum

В настоящее время у меня есть проект среды выполнения Windows Phone 8.1 с перечислениями, в которых используется атрибут строкового значения. Я хочу иметь возможность получить значение перечисления, используя атрибут строкового значения, например, использовать «мир», чтобы получить значение перечисления лета. Я использую среду выполнения Windows phone 8.1, поэтому большинство методов, которые я нашел, не работают.

Заранее спасибо.

public enum test  
{ 
    [StringValue("hello")] 
    school, 
    [StringValue("world")] 
    summer, 
    [StringValue("fall")] 
    car 
} 

public class StringValueAttribute : Attribute 
{ 
    private string _value; 
    public StringValueAttribute(string value) 
    { 
       _value = value;
    } 

    public string Value 
    { 
       get { return _value; } 
    } 
} 

person sidy3d    schedule 24.04.2014    source источник
comment
Я удалил тег из заголовка вопроса. Обратите внимание, что в большинстве случаев вопросы не должны включать теги в свой заголовок< /а>.   -  person Romasz    schedule 25.04.2014


Ответы (1)


Чтобы добраться до ваших атрибутов, вам нужно будет использовать метод/расширение. Следуя этому вопросу и ответу, вы можете сделать следующее:

public class StringValueAttribute : Attribute
{
    private string _value;
    public StringValueAttribute(string value)
    {
        _value = value;
    }

    public string Value
    {
        get { return _value; }
    }

    public static string GetStringValue(Enum value)
    {
        Type type = value.GetType();
        FieldInfo fi = type.GetRuntimeField(value.ToString());
        return (fi.GetCustomAttributes(typeof(StringValueAttribute), false).FirstOrDefault() as StringValueAttribute).Value;
    }
}

Затем, используя эту строку кода:

string stringTest = StringValueAttribute.GetStringValue(test.summer);

даст результат "мир". (Противоположно тому, что вы хотели, но, надеюсь, даст вам представление о том, как справиться с проблемой).

В зависимости от того, чего вы хотите достичь, вы, вероятно, можете использовать разные методы: используя Dictionary, struct, свойства и, возможно, по-разному.

Что касается анализа значений Enum, вы можете добиться этого следующим образом:

test testValue = test.summer;
string testString = testValue.ToString();
test EnumValue = (test)Enum.Parse(typeof(test), testString);

ИЗМЕНИТЬ

Если вы хотите получить перечисление из атрибута, то этот метод (вероятно, следует улучшить) должен выполнять эту работу:

public static T GetFromAttribute<T>(string attributeName)
{
    Type type = typeof(T);
    return (T)Enum.Parse(typeof(T), type.GetRuntimeFields().FirstOrDefault(
      x => (x.CustomAttributes.Count() > 0 && (x.CustomAttributes.FirstOrDefault().ConstructorArguments.FirstOrDefault().Value as string).Equals(attributeName))).Name);
}

Использование:

test EnumTest = StringValueAttribute.GetFromAttribute<test>("world");
person Romasz    schedule 25.04.2014
comment
У меня уже есть код для получения атрибута stringvalue из перечисления. Что я хочу сделать, так это получить перечисление из атрибута stringvalue. - person sidy3d; 25.04.2014
comment
@ sidy3d sidy3d Я добавил одну способность, если вы не нашли другой. Как я тестировал, он должен работать, но, вероятно, нуждается в некоторых улучшениях. Действительно ли необходимо использовать атрибуты enum и string? Может быть, есть лучшие решения? - person Romasz; 25.04.2014