У меня есть метод, берущий объект и возвращающий его в строковом формате с некоторым материалом в зависимости от типа. Например:Преобразование 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();
}
Мой вопрос: я могу избежать рефлексия здесь? Потому что эти методы называются много раз.
попробовать 'ConvertObjectToSQL (((ИНТ) FooEnum.Foo) .ToString())' –
@Luminous_Dev: что не может делать то, что требуется, если перечисление не основывается на 'int' ... – Chris
@Luminous_Dev: как я уже сказал: 'мой метод вызывается в контексте, где я не могу знать тип перечисления'. Итак, как сказано @Chris, перечисление не обязательно основано на int. – fharreau