2017-02-22 6 views
1

У меня есть метод, берущий объект и возвращающий его в строковом формате с некоторым материалом в зависимости от типа. Например:Преобразование enum базового значения в строку без знания типа перечисления

ConvertObjectToSQL(1); // "1" 
ConvertObjectToSQL("Foo"); // "'Foo'" 
ConvertObjectToSQL(DateTime.Now); // "'2017/02/22 00:00:00'" 

Проблема возникает, когда я предоставляю перечисление этому методу. Я хочу, чтобы мой метод действовал так, как будто я предоставил ему тип перечисления, лежащий в основе. Конечно, мой метод вызывается в контексте, где я не могу знать тип перечисления.

В первую очередь, вот что я сделал:

private string ConvertObjectToSQL(object obj) 
{ 
    if (obj == null) 
    { 
     return "NULL"; 
    } 
    else if (obj is DateTime) 
    { 
     return "'" + obj.ToString() + "'"; 
    } 
    else if (obj is string) 
    { 
     return "'" + obj.ToString().Replace("'", "''") + "'"; 
    } 

    return obj.ToString(); 
} 

Но если мое перечисление:

enum FooEnum : int { Foo = 0, Bar = 1 } 

Если хотите:

ConvertObjectToSQL(FooEnum.Foo); // "0" 
ConvertObjectToSQL(FooEnum.Bar); // "1" 

Но на самом деле возвращает:

Так что я в конечном итоге с новым еще, если выполнение работы:

else if (obj is Enum) 
{ 
    var baseType = Enum.GetUnderlyingType(obj.GetType()); 
    return Convert.ChangeType(obj, baseType).ToString(); 
} 

Мой вопрос: я могу избежать рефлексия здесь? Потому что эти методы называются много раз.

+0

попробовать 'ConvertObjectToSQL (((ИНТ) FooEnum.Foo) .ToString())' –

+0

@Luminous_Dev: что не может делать то, что требуется, если перечисление не основывается на 'int' ... – Chris

+0

@Luminous_Dev: как я уже сказал: 'мой метод вызывается в контексте, где я не могу знать тип перечисления'. Итак, как сказано @Chris, перечисление не обязательно основано на int. – fharreau

ответ

1

С enums орудие IConvertable мы можем конвертировать его в Decimal (который будет охватывать размер всех интегральных типов), а затем до string.

private string ConvertObjectToSQL(object obj) 
{ 
    if(obj is Enum) 
    { 
     return Convert.ToDecimal(obj).ToString(); 
     //return ((Enum)obj).ToString("D"); Or this 
    } 
    return ""; 
} 
+0

Это не сработает, потому что я не знаю базовый тип перечисления. В моем примере я выбираю int, но это может быть 'char' например – fharreau

+0

Является ли законным в IL для перечисления на основе' char'? C# допускает только числовые интегральные типы. –

+0

Хотите вернуть числовое значение? – Magnus

Смежные вопросы