2016-04-05 26 views
0

Bu, google! 'A zor bir sorudur!C# "Enum" yöntemi ve "enum" parametresi

"Enum" parametresini parametre olarak alan bir uzantı yöntemim var.

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

ama ilan enum ile bunu kullanmaya çalıştığınızda derleyici uzantısı yöntemi

olarak sözlüğü ilan etmek dışında bu işi yapmak nasıl

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

herhangi bir fikir bulamıyorum

Dictionary<Enum, String> Attributes 

, bildirilen bir enum'un sahip olduğu noktayı hangi türden yenilgiye uğratır? Ne yapmak istiyoruz olup

Çok teşekkürler

+0

A 'Sözlük Sözlük <' dan devralan gelmez ' Enum, string> 've dolayısıyla uyumlu değil. Bu parametre için jenerik bir tür kullanmanız gerekecek, ancak C# 'de izin verilemediği için, enumlar üzerinde genel bir kısıtlama yapmak için buraya izin verilmeyecektir. –

+1

Yan nota: Anahtar mevcutsa neden iki kez kontrol ediyorsunuz? –

+0

@ LasseV.Karlsen 'struct' üzerinde bir kısıtlama olabilir. Biraz yardımcı olabilir. –

cevap

-1

(aşağıdaki geçerli bir C# kodu değil):

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

Bu derleme olmaz (Kısıtlama özel sınıf 'Numaralandırma' olamaz). Yani alternatifler aramak zorundasınız. this sorusuna bazı iyi cevaplar var. En kolay yolu where U : struct, IConvertible

+0

Bu temelde CodeCaster'ın ve yorumumu alıp bunları bir yanıtla birleştiriyor. Ancak, cevabınız daha eksiksiz olmalı ve olmalıdır. –

+0

@ZoharPeled Cevabımı daha eksiksiz hale getirmeyi önerebilirsiniz. –

1

'u kullanmaktır. Aynen istediğiniz gibi yapamazsınız, çünkü tekil enumlar Enum'un alt sınıfları değildir. Ama bu kod istediğiniz gibi güzel olmasa da, pek çirkin ve istediğiniz gibi çalışır:

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