从PropertyInfo获取Func <t1,t2 =“”>

时间:2019-02-13 20:57:45

标签: c# linq system.reflection propertyinfo

我陷入了以下问题:
我有一个类似的课程

public class DataItem
{
    public decimal? ValueA{ get; set; }
    public decimal? ValueB { get; set; }
    public decimal? valueC { get; set; }
    ...
}

,并且想要类似的东西

 var keySelectors = new Dictionary<string, Func<DataItem, decimal?>>
 {
     {"ValueA", x => x.ValueA},
     {"ValueB", x => x.ValueB},
     {"ValueC", x => x.ValueC},
     ...
 }.ToList();

用于用户定义的分析,但是我需要一种更通用的方法来创建它。
所以我尝试了以下方法:

var keySelectors= typeof(DataItem).GetProperties()
  .Select(x => new KeyValuePair<string, Func<DataItem, decimal?>>(x.Name, x.DoNotKnow));

不知道是我迷路的地方。

这是否是获取期望结果的错误方法,以使用户能够选择其分析所基于的数据?

3 个答案:

答案 0 :(得分:2)

您要执行的操作是创建实例方法(属性的getter方法)的委托。这可以通过CreateDelegate完成:

#include <numeric>
#include <iterator>

int myArray[200];
using std::begin;
using std::end;
std::iota(begin(myArray), end(myArray), 100); // this parts is usually within a function body

调用委托要比在PropertyInfo上使用基于反射的方法GetValue更快,但是显然影响取决于您的方案。

答案 1 :(得分:0)

这是一种方法:

typeof(DataItem).GetProperties()
    .Select(p => new KeyValuePair<string, Func<DataItem, decimal?>>(
        p.Name,
        item => (decimal?)typeof(DataItem).InvokeMember(p.Name, BindingFlags.GetProperty, null, item, null)
    ));

答案 2 :(得分:0)

人类可读的解决方案:

Func<DataItem, decimal?> GetValue(PropertyInfo p) => (item) => (decimal?)(p.GetValue(item));

var keySelctors =  typeof(DataItem).GetProperties().ToDictionary(p => p.Name, GetValue);