2017-02-22 32 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" 

但它實際上返回:

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

嘗試'ConvertObjectToSQL(((int)的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

相關問題