2016-06-20 11 views
6

Tôi muốn để có thể thực hiện một cuốn từ điển với khóa Type và giá trị của Func<T> nơi T là một đối tượng cùng loại như là chìa khóa:Có thể lưu trữ Func <T> trong từ điển không?

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

Vì vậy, về cơ bản, từ điển sẽ được phổ biến với các loại có thể tham chiếu đến một Func<T> sẽ trả về giá trị đó:

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

Làm cách nào để triển khai và thực thi điều này?

+1

là 'T' giống nhau cho tất cả các yếu tố trong từ điển? – Dai

+2

Không có cách nào để gõ mạnh. Nó sẽ không có ý nghĩa, anyway. Loại 'var thing = TypeDictionary [someType];' là gì? Nếu bạn có 'someType = typeof (int)', nó có thể khá rõ ràng. Nhưng điều gì xảy ra nếu nó được lấy từ 'obj.GetType()' với 'obj' được gọi là' đối tượng'? Bạn có thể thêm các phương thức hạn chế kiểu, nhưng bạn sẽ * luôn luôn * phải kết thúc bằng 'Dictionary ()' và cast nó khi lấy giá trị. – Rob

+0

Không. T nên khác nhau cho mỗi mục nhập trong từ điển ... hãy để tôi thay đổi câu hỏi của tôi để phản ánh ... – Will

Trả lời

7

Đây là khoảng gần như là bạn sẽ nhận được:

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

Đóng đủ. Điều này sẽ phù hợp với nhu cầu của tôi; cảm ơn. – Will

Các vấn đề liên quan