Как выбрать из списка только некоторые свойства в зависимости от списка имен свойств? - PullRequest
0 голосов
/ 10 июля 2020

Я ищу выбор, где результат анонимный, но свойства даны из списка строк

Пример

public class A{
     public string PropertyA {get; set;}
     public double PropertyB {get; set;}
     public double PropertyC {get; set;}
     public double PropertyD {get; set;}
}

var list = new List<A>{ ... };

var propertyNames = new List<string>{"PropertyA", "PropertyD"}

Я хотел бы создать селектор который создает анонимный объект с помощью PropertyA и PropertyD, поэтому я могу получить что-то вроде

var result = list.Select( selector(propertynames) ).ToList();

, где снова result [0] анонимен со свойствами, такими как result [0] .PropertyA и result [0] .PropertyD

1 Ответ

1 голос
/ 10 июля 2020

Я бы действительно, действительно предложил бы по-другому взглянуть на это. Однако есть один способ решить эту проблему - использовать System.Dynamic.ExpandoObject:

var result = list
    .Select(i =>
    {
        var expando = new ExpandoObject();
        var expandoAsDict = (IDictionary<string, object>)expando;
        var targetProperties = i
            .GetType()
            .GetProperties()
            .Where(p => propertyNames.Contains(p.Name))
            .ToDictionary(p => p.Name, p => p.GetValue(i));
        foreach (var property in targetProperties)
        {
            expandoAsDict.Add(property);
        }
        return (dynamic)expando;
    })
    .ToList();

Затем вы можете продолжить, как вы описываете, например:

Console.WriteLine(result[0].PropertyA);

записывает ожидаемое значение .

Конечно, вы можете забыть о поддержке Intellisense для вашего типа Dynami c (если это не было очевидно для начала). Примечание: другим подходом было бы создание вашего типа во время выполнения с использованием System.Reflection.Emit, но это было бы еще более неудобно.

Удачи!

...