我有一个静态类,负责保存一些默认数据集成测试使用,以前它使用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