Мне нужно создать дерево выражений, возвращающее Expression<Func<TDataStructure, Double[]>> expression
. Обманная часть об этом заключается в том, что TDataStructure
является общим, что подразумевает, что каждый прошедший класс содержит разные свойства. Мне нужно получить свойства типа Double?
и имена, начинающиеся с определенной строки, например "output"
.Как создать дерево выражений, возвращающее ограниченный набор свойств на основе соглашения?
Простой пример случай (класс бетона):
Expression<Func<ConcreteDataStructure, Double[]>> expression =
structure => new Double[] {
structure.inputProperty1.Value,
structure.outputProperty1.Value,
structure.outputProperty2.Value
};
где: structure.inputProperty1.Value
, structure.outputProperty1.Value
, structure.outputProperty2.Value
имеют тип Double?
Мой случай:
Я не знаю, сколько свойства типа
Double?
вTDataStructure
мне нужно получить только эти типа
Double?
, начиная с"output"
Выражение будет использоваться в методе
IQueryable<TDataStructure> Select
для проектирования каждого элемента последовательности в новую форму.
И 1 и 2 могут быть решены с помощью отражения: смотреть на 'Type.GetProperties()' или 'TypeInfo.GetProperties()' (в зависимости от отражения API вы используете). –
Это, я знаю. Но я не знаю, как использовать его в Expression. вар свойства = TypeOf (TrainingData) .GetProperties() .где (свойство => property.PropertyType == TypeOf (Double) && property.Name.ToLowerInvariant() StartsWith ("продукт")?!.); – Marek
@Marek: Правильно, поэтому, как только вы найдете свойства, которые хотите использовать, вы можете использовать выражение Expression.Property для создания выражения для каждого из этих свойств ... –