Я бы действительно, действительно предложил бы по-другому взглянуть на это. Однако есть один способ решить эту проблему - использовать 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
, но это было бы еще более неудобно.
Удачи!