C # явная приведенная строка для перечисления - PullRequest
23 голосов
/ 30 июня 2009

Я хотел бы иметь явное приведение между строкой и перечислением в c #, чтобы иметь это:

(MyEnum) Enum.Parse(typeof(MyEnum),stringValue)

Я бы хотел выслать это в явный оператор приведения, я сделал это, но не сработало:

public static explicit operator (MyEnum)(value stringValue){
     return (MyEnum) Enum.Parse(typeof(MyEnum),stringValue);
}

Знаете ли вы, возможно ли это в C # с использованием .NET 3.5?

Ответы [ 3 ]

29 голосов
/ 30 июня 2009

Применение не возможно. Проблема заключается в том, что определяемое пользователем преобразование должно быть включено в объявление структуры или класса, а преобразование должно быть в / из включающего типа. Таким образом,

public static explicit operator MyEnum(string value)

невозможно, потому что ни MyEnum, ни string не могут быть типом включения.

Соответствующий раздел спецификации ECMA334 C # - 17.9.4:

Оператор преобразования выполняет преобразование из типа источника, указанного типом параметра преобразования оператор, к целевому типу, указанному типом возврата оператора преобразования. Класс или структура разрешено объявлять преобразование из исходного типа S в целевой тип T, только если все из следующего верно где S0 и T0 - типы, которые возникают в результате удаления трейлинга? модификаторы, если таковые имеются, от S и T:

S0 и T0 - это разные типы.

S0 или T0 - это класс или тип структуры, в которых происходит объявление оператора .

Ни S0, ни T0 не являются интерфейсами.

За исключением пользовательских преобразований, преобразования не существует из S в T или из T в S.

Однако вы можете создать метод расширения для класса строки.

public static class StringExtensions {
    public static T ConvertToEnum<T>(this string value)  {
        Contract.Requires(typeof(T).IsEnum);
        Contract.Requires(value != null);
        Contract.Requires(Enum.IsDefined(typeof(T), value));
        return (T)Enum.Parse(typeof(T), value);
    }
}
9 голосов
/ 30 июня 2009

Нужно ли использовать оператор приведения? Другой вариант - добавить метод расширения вне строки:

public static class StringEnumConversion
{
    public static T Convert<T>(this string str)
    {
        return (T)Enum.Parse(typeof(T), str);
    }
}
0 голосов
/ 30 июня 2009

Вы также можете использовать атрибуты "StringValue", чтобы получить то, что вы хотите.

Проверьте этот вопрос: stackoverflow.com / questions / 424366 / c-string-enums , там достаточно информации, которая может помочь.

ура

...