Общий метод для получения строки из ENUM (путем передачи значения int) - PullRequest
0 голосов
/ 17 февраля 2012

Я написал общий метод для преобразования int в Enum String, получая ошибку.Пожалуйста, помогите спасибо.

    public static string GetStringEquiValentOFEnumFromString<T>(int enumVal)
        where T : struct
    {
        if(Enum.IsDefined(typeof(T),enumVal))
        {
            return ((T)enumVal).ToString();  ///Error: Cannot convert type 'int' to 'T'
        }          
        return null;  
    }

Ответы [ 4 ]

2 голосов
/ 17 февраля 2012

Я думаю, вы можете использовать Enum.ToObject:

public static string GetStringEquiValentOFEnumFromString<T>(int enumVal)
     where T : struct
    {
        if (Enum.IsDefined(typeof(T), enumVal))
        {
            return Enum.ToObject(typeof (T), enumVal).ToString();
        }
    }

http://msdn.microsoft.com/en-us/library/system.enum.toobject.aspx

0 голосов
/ 13 июня 2013

открытый статический класс StringEnum {

    public static string GetStringValue(Enum value)
    {
        string output = null;
        Type type = value.GetType();

        FieldInfo fi = type.GetField(value.ToString());
        StringValue[] attr = fi.GetCustomAttributes(typeof(StringValue), false) as StringValue[];

        if (attr.Length > 0)
        {
            output = attr[0].Value;
        }
        return output;
    }
}

StringEnum - это класс, в котором есть метод (GetStringValue) для получения строкового значения.

открытый enum CampaignRequestType {[StringValue ("None")] Нет = 0, [StringValue ("Аптечные карточки")] Pharmacy_Cards = 1, [StringValue ("Кампания по проспекту")] Prospect_Campaign = 2, [StringValue ("Выставка / реклама")] Tradeshow_Advertising = 3}

это перечисление ...

string item = StringEnum.GetStringValue ((Enumeration.CampaignRequestType) updateRequestStatus.RequestType_Code);

здесь (Enumeration.CampaignRequestType) является моим enumerationType. update__ReceptionType. is_RecomeType.поле базы данных тип int

приведено значение типа int к типу перечисления

0 голосов
/ 17 февраля 2012

Это должно сработать:

public static string GetStringEquiValentOFEnumFromString<T>(int enumVal) 
    where T : struct 
{ 
    if(Enum.IsDefined(typeof(T),enumVal)) 
    { 
        return ((T)(object)enumVal).ToString();
    }           
    return null;   
} 
0 голосов
/ 17 февраля 2012

Вы видите эту ошибку, потому что аргументы универсального типа не могут быть ограничены типом enum в C #.Поскольку ваше ограничение только говорит, что это должен быть тип значения, компилятор не может гарантировать, что enumVal будет преобразован в T и выдает ошибку времени компиляции.

Чтобы обойти это, вы можете явно определить перечислениевведите функцию:

public static string GetStringFromValue(this MyEnum enum, int val) {
   if (Enum.IsDefined(typeof(MyEnum), val)) {
      return ((MyEnum) val).ToString();
   }
   return null;
}

Или вы можете использовать что-то вроде библиотеки UnconstrainedMelody Джона Скита, которая переписывает ваш код на уровне байт-кода, чтобы применить ограничение enum (вызывается из другой сборки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...