2016-04-05 14 views
0

これはGoogleにとっては難しい質問です!メソッドの "Enum"と "enum"パラメータ

"Enum"をパラメータとする拡張メソッドがあります。

public static T GetEntry<T>(this Dictionary<Enum, string> dictionary, Enum key) 
    { 
     string val; 
     if (dictionary.TryGetValue(key, out val)) 
     { 
      return (T)Convert.ChangeType(val, typeof(T));    
     } 
     return default(T); 
    } 

が、私は宣言した列挙型とそれを使用しようとすると、コンパイラは、拡張メソッド

として辞書を宣言する以外、この作品を作るための方法を

Dictionary<CmdAttr, String> Attributes; 
cmd.CommandText.Attributes.GetEntry<double>(CommandText.CmdAttr.X); 

任意のアイデアを見つけることができません

Dictionary<Enum, String> Attributes 

これは動作しますが、宣言された列挙型を持つ点を打ち消してしまいますか?何をしたいことはある

多くのおかげ

+0

'辞典' '辞書<から継承していませんEnum、string> 'と互換性がありません。そのパラメータにはジェネリック型を使用する必要がありますが、C#ではenumにジェネリック制約を設定することはできないため、ここで任意の型を受け付ける可能性があります。 –

+1

サイドノート:キーが存在する場合、なぜ2回チェックしていますか? –

+0

@ LasseV.Karlsenあなたは 'struct'に制約を加えることができます。少し助けてくれました。 –

答えて

-1

(以下は、有効なC#コードではありません):

public static T GetEntry<T,U>(this Dictionary<U, string> dictionary, U key) where U : Enum 
{ 
    // your code 
} 

これはコンパイルされません(制約は特別なクラスの列挙 'にすることはできません)。 代替手段を探す必要があります。 this質問に良い答えがいくつかあります。最も簡単な方法は、使用することですwhere U : struct, IConvertible

+0

これは基本的にCodeCasterと私のコメントを受け取り、それらを回答に結びつけることです。しかし、あなたの答えはより完全であり、より完全でなければなりません。 –

+0

@ZoharPeled私の答えをより完全にする方法を提案することは大歓迎です。 –

1

個別の列挙型はEnumのサブクラスではないので、あなたはまったく同じようにすることはできません。しかし、このコードは、あなたが好きなようにきれいではないが、それはほとんど醜いだし、あなたが好きな、それは動作します:

// MyTestEnum.cs 

enum MyTestEnum 
{ 
    First, 
    Second, 
    Third 
} 

// Extensions.cs 

static class Extensions 
{ 
    public static TResult GetEntry<TEnum, TResult>(this Dictionary<TEnum, string> dictionary, TEnum key) 
    { 
     string value; 
     if (dictionary.TryGetValue(key, out value)) 
     { 
      return (TResult)Convert.ChangeType(value, typeof(TResult)); 
     } 
     return default(TResult); 
    } 
} 

// most likely Program.cs 

void Main() 
{ 
    Dictionary<MyTestEnum, string> attributes = new Dictionary<MyTestEnum, string>(); 
    attributes.Add(MyTestEnum.First, "1.23"); 

    // *** here's the actual call to the extension method *** 
    var result = attributes.GetEntry<MyTestEnum, double>(MyTestEnum.First); 

    Console.WriteLine(result); 
}