我有一个方法获取一个对象并以字符串格式返回它,其中包含一些根据类型的东西。例如:
ConvertObjectToSQL(1); // "1"
ConvertObjectToSQL("Foo"); // "'Foo'"
ConvertObjectToSQL(DateTime.Now); // "'2017/02/22 00:00:00'"
当我为该方法提供枚举时,我的问题就出现了。我希望我的方法表现得好像我提供了enum底层类型。当然,我的方法是在我不可能知道枚举类型的上下文中调用的。
首先,这就是我所做的:
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"
但实际上它会回归:
ConvertObjectToSQL(FooEnum.Foo); // "Foo"
ConvertObjectToSQL(FooEnum.Bar); // "Bar"
所以如果做这项工作,我最终会得到一个新的:
else if (obj is Enum)
{
var baseType = Enum.GetUnderlyingType(obj.GetType());
return Convert.ChangeType(obj, baseType).ToString();
}
我的问题是:我能在这里避免反思吗?因为这种方法被称为很多次。
答案 0 :(得分: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 "";
}
答案 1 :(得分:0)
您可以创建一个委托以获取基础类型值并将其缓存。
''' <summary>
''' Caches an enum underlying value getter delegate.
''' </summary>
''' <typeparam name="TEnum">Enum type</typeparam>
Public Class CachedEnumUnderlyingValueAccess(Of TEnum)
Private Shared underlyingTypeValueGetter As Func(Of TEnum, Object) = CreateUnderlyingTypeValueGetter()
Private Shared Function CreateUnderlyingTypeValueGetter()
Dim enumUnderlyingType As Type = [Enum].GetUnderlyingType(GetType(TEnum))
Dim enumParameter As ParameterExpression = Expression.Parameter(GetType(TEnum))
'Convert the enum parameter to its underlying type, then convert it to an Object
Dim conversionExpression As Expression(Of Func(Of TEnum, Object)) = Expression.Lambda(Expression.Convert(Expression.Convert(enumParameter, enumUnderlyingType), GetType(Object)), enumParameter)
Return conversionExpression.Compile()
End Function
Public Shared Function GetEnumUnderlyingValue(val As TEnum) As Object
Return underlyingTypeValueGetter.Invoke(val)
End Function
End Class