如何从用lambda定义的Func中获取返回类型
本文关键字:Func 获取 返回类型 定义 lambda | 更新日期: 2023-09-27 18:28:03
我有一个静态类,负责保存集成测试使用的一些默认数据,以前它使用Dictionary<Type,object>
来存储这些值,但因为我需要能够修改我得到的对象,而不会影响我使用Dictionary<Type,Func<object>>
移动到的同一对象的未来请求,这很好。
现在,为了让最终用户更容易使用这个静态数据存储,我添加了另一个类来包装字典:
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
。
在给定当前步骤的情况下,是否有获得正确类型的方法,或者是否有实现每次都返回新实例的静态数据存储的不同方法?
需要.Net>=4.0
用Generic:替换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();
}
这消除了对一般方差的需要