2014-10-27 54 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

相关问题