我陷入了以下问题:
我有一个类似的课程
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));
不知道是我迷路的地方。
这是否是获取期望结果的错误方法,以使用户能够选择其分析所基于的数据?
答案 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);