Подтвердить что ты не робот

Явная строка строки С# для перечисления

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

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

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

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

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

4b9b3361

Ответ 1

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

public static explicit operator MyEnum(string value)

невозможно, потому что ни MyEnum, ни string никогда не могут быть закрывающим типом.

Соответствующий раздел спецификации ECMA334 С# равен 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);
    }
}

Ответ 2

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

public static class StringEnumConversion
{
    public static T Convert<T>(this string str)
    {
        return (T)Enum.Parse(typeof(T), str);
    }
}

Ответ 3

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

Посмотрите на этот вопрос: fooobar.com/info/11842/..., там есть много информации, которая может помочь.

веселит