在不知道枚举类型的情况下将枚举基础值转换为字符串

时间:2017-02-22 09:51:35

标签: c# enums

我有一个方法获取一个对象并以字符串格式返回它,其中包含一些根据类型的东西。例如:

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();
}

我的问题是:我能在这里避免反思吗?因为这种方法被称为很多次。

2 个答案:

答案 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