2017-02-22 14 views
1

オブジェクトを取得し、その型に応じていくつかのものを含む文字列形式で返すメソッドがあります。例:列挙型を知らなくても列挙型の基礎値を文字列に変換する

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

私はそのメソッドに列挙型を指定すると問題が発生します。私は私のメソッドがenum基底型を提供したかのように動作するようにしたい。もちろん、私のメソッドは、おそらく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

試し 'ConvertObjectToSQL(((int型)FooEnum.Foo).toString())' –

+0

@Luminous_Dev:列挙型が 'int' ... – Chris

+0

に基づいていない場合は希望するものを行うことがありません@ Luminous_Dev:私が言ったように: '私のメソッドは、おそらくenum型を知ることができない文脈で呼び出されます。だから@クリス、列挙型は必ずしもintに基づいていないと述べた。 – fharreau

答えて

1

enumsIConvertableを実装しているため、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'に基づいてenumを持つことは合法ですか? C#では数値の整数型のみが使用できます。 –

+0

数値を戻しますか? – Magnus

関連する問題