如何从用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

在给定当前步骤的情况下,是否有获得正确类型的方法,或者是否有实现每次都返回新实例的静态数据存储的不同方法?

如何从用lambda定义的Func中获取返回类型

需要.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();
}

这消除了对一般方差的需要