2016-06-20 13 views
6

Mi piacerebbe essere in grado di attuare un dizionario con una chiave di Type e un valore di Func<T> dove T è un oggetto dello stesso tipo come la chiave:È possibile memorizzare un Func <T> all'interno di un dizionario?

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

Quindi, in sostanza, il dizionario sarebbe essere popolato con i tipi che fanno riferimento a un Func<T> che tornare quel valore:

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

Come posso fare per applicare e far rispettare questo?

+1

è 'T' lo stesso per tutti gli elementi all'interno del dizionario? – Dai

+2

Non c'è modo di avere una digitazione forte. Comunque non avrebbe senso. Qual è il tipo di 'var thing = TypeDictionary [someType];'? Se hai 'someType = typeof (int)', potrebbe essere abbastanza ovvio. Ma cosa succede se è preso da 'obj.GetType()' con 'obj' cast come' object'? Puoi aggiungere metodi che limitano il tipo, ma dovrai * sempre * finire con 'Dizionario ()' e lanciarlo quando si recupera il valore. – Rob

+0

No. T dovrebbe essere diverso per ogni voce nel dizionario ... fammi cambiare la mia domanda per riflettere ... – Will

risposta

7

Questo è quanto di più vicino si sta andando ad ottenere:

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

Abbastanza vicino. Questo soddisferà i miei bisogni; Grazie. – Will

Problemi correlati