2016-06-20 12 views
6

Chciałbym być w stanie realizować słownika z kluczem Type i wartości Func<T> gdzie T jest przedmiotem tego samego typu co kluczowe:Czy jest możliwe zapisanie Func <T> w słowniku?

Dictionary<Type, Func<T>> TypeDictionary = new Dictionary<Type, Func<T>>() /*Func<T> returns an object of the same type as the Key*/ 

TypeDictionary.Add(typeof(int), () => 5); 
TypeDictionary.Add(typeof(string), () => "Foo"); 

Więc w zasadzie, by słownika być wypełniane typów, które odwołują się Func<T> który wróci, że wartość:

int Bar = TypeDictionary[ typeof(int) ](); 
string Baz = TypeDictionary[ typeof(string) ](); 

Jak mogę iść o wdrażanie i egzekwowanie tego?

+1

jest 'T' takie same dla wszystkich elementów w słowniku? – Dai

+2

Nie ma sposobu na silne pisanie. W każdym razie nie miałoby to sensu. Jaki jest typ 'var thing = TypeDictionary [someType];'? Jeśli masz 'someType = typeof (int)', może to być dość oczywiste. Ale co się stanie, jeśli zostanie wzięty z 'obj.GetType()' z 'obj' rzutowanym na' object'? Możesz dodać metody, które ograniczają typ, ale * zawsze * będziesz musiał skończyć z 'Słownikiem ()' i przesłać go podczas pobierania wartości. – Rob

+0

Nr T powinna być inna dla każdego wpisu w słowniku ... Pozwól mi zmienić moje pytanie, aby odzwierciedlić ... – Will

Odpowiedz

7

To jest tak blisko, jak masz zamiar dostać:

void Main() 
{ 
    var myDict = new MyWrappedDictionary(); 
    myDict.Add(() => "Rob"); 
    var func = myDict.Get<string>(); 
    Console.WriteLine(func()); 
} 

public class MyWrappedDictionary 
{ 
    private Dictionary<Type, object> innerDictionary = new Dictionary<Type, object>(); 
    public void Add<T>(Func<T> func) 
    { 
     innerDictionary.Add(typeof(T), func); 
    } 
    public Func<T> Get<T>() 
    { 
     return innerDictionary[typeof(T)] as Func<T>; 
    } 
} 
+0

Wystarczająco blisko. To będzie odpowiadało moim potrzebom; dzięki. – Will

Powiązane problemy