2014-10-27 56 views
1

我有一個靜態類,負責保存一些默認數據集成測試使用,以前它使用Dictionary<Type,object>來存儲這些值,但因爲我需要能夠修改我得到的對象,而不影響未來的請求相同對象我已經轉向使用Dictionary<Type,Func<object>>這很好。如何從一個用lambda定義的Func中獲取返回類型?

現在在嘗試使用這張靜態數據存儲更容易爲最終用戶,我添加了另一個類來包裝的詞典:

public class FuncValueDictionary 
{ 
    private readonly Dictionary<Type, Func<object>> _funcs; 

    public FuncValueDictionary() 
    { 
     _funcs = new Dictionary<Type, Func<object>>(); 
    } 

    public T Get<T>() 
    { 
     var key = typeof (T); 
     if (_funcs.ContainsKey(key)) 
     { 
      return (T)_funcs[key](); 
     } 
     throw new Exception("Dictionary does not contain a value for key: " + key); 

    } 

    public void Add(Func<object> value) 
    { 
     var key = value().GetType(); 
     if (_funcs.ContainsKey(key)) 
     { 
      throw new Exception("Dictionary already contains value for key: " + key); 
     } 

     _funcs[key] = value; 
    } 
} 

正如這個工作,但我與它的問題是,它目前必須在添加新值時運行該函數(這是爲了獲得要存儲的函數的返回類型)。

增加值的一個例子:

var DefaultData = new FuncValueDictionary() 
... 
DefaultData.Add(() => new TestDataSet { SomeTestDataValue = "10.00" }); 

我試圖找到一種方法來確定這種類型從功能本身,我已經試過value.Method.ReturnType但是這僅僅是返回object

有沒有辦法在給定當前步驟的情況下獲得正確類型,或者實現每次都返回一個新實例的靜態數據存儲的不同方法?

+0

剛剛離開我的頭頂,應該將您的Add方法定義爲:public void Add(Func value) – gmiley 2014-10-27 16:38:16

+1

我相信我已經嘗試過了,但接着'_funcs [key] = value '會失敗,因爲它不再是'Func ' – Phaeze 2014-10-27 16:39:20

+0

請參閱tolanj的答案,這應該照顧你所得到的例外。 – gmiley 2014-10-27 16:40:49

回答

3

需要Net> = 4.0

與通用替換Add方法:

public void Add<T>(Func<T> value) where T:class 
{ 
    if (_funcs.ContainsKey(typeof(T))) 
    { 
     throw new Exception("Dictionary already contains value for key: " + typeof(T)); 
    } 

    _funcs[typeof(T)] = value; 
} 

道歉草草粘貼剛纔的答覆!

當然,這是不會的值類型

工作NB

(從自刪除回覆被偷了!)

對於.NET < = 4.0你可以這樣做:

public void Add<T>(Func<T> value) where T:class 
{ 
    if (_funcs.ContainsKey(typeof(T))) 
    { 
     throw new Exception("Dictionary already contains value for key: " + typeof(T)); 
    } 

    _funcs[typeof(T)] =() => (object)value(); 
} 

Whic h刪除了通用差異的需要

+1

這是行不通的,因爲'_funcs'預計'Func ' – Phaeze 2014-10-27 16:40:22

+0

'_funcs [T]'不會編譯。 '_funcs [typeof(T)]'也不起作用。 – dasblinkenlight 2014-10-27 16:40:35

+0

而且我無法更改_funcs定義,因爲我將爲多個不同的對象存儲funcs。 – Phaeze 2014-10-27 16:40:59

相關問題