我有一個靜態類,負責保存一些默認數據集成測試使用,以前它使用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
。
有沒有辦法在給定當前步驟的情況下獲得正確類型,或者實現每次都返回一個新實例的靜態數據存儲的不同方法?
剛剛離開我的頭頂,應該將您的Add方法定義爲:public void Add(Func value) –
gmiley
2014-10-27 16:38:16
我相信我已經嘗試過了,但接着'_funcs [key] = value '會失敗,因爲它不再是'Func
請參閱tolanj的答案,這應該照顧你所得到的例外。 – gmiley 2014-10-27 16:40:49