Получить Funcиз PropertyInfo - PullRequest
       50

Получить Funcиз PropertyInfo

0 голосов
/ 13 февраля 2019

Я застрял в следующей проблеме:
У меня есть класс, такой как

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));

DoNotKnow - это точка, где я теряюсь.

Или это неправильный подход к желаемому результату, позволяющий пользователю выбирать данные, на которых основан его анализ?

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Вот один из способов:

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)
    ));
0 голосов
/ 14 февраля 2019

Удобочитаемое решение:

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

var keySelctors =  typeof(DataItem).GetProperties().ToDictionary(p => p.Name, GetValue);
0 голосов
/ 14 февраля 2019

Что вы хотите сделать, это создать делегат для метода экземпляра, метода получения свойства.Это можно сделать с помощью CreateDelegate:

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

Вызов делегата происходит быстрее, чем при использовании метода на основе отражений GetValue для PropertyInfo, но, очевидно, влияние зависит от вашего сценария.

...