如何根据约定创建返回受限属性集的表达式树
本文关键字:属性 表达式 何根 约定 创建 返回 | 更新日期: 2023-09-27 17:59:10
我需要创建一个返回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?
我的案例:
我不知道
TDataStructure
中有多少Double?
类型的属性我只需要得到
Double?
类型的,从"output"
开始表达式将用于
IQueryable<TDataStructure> Select
方法,用于将每个序列元素投影为新的形式
试试这个:
public static Expression<Func<T, Double[]>> BuildExpression<T>()
{
ParameterExpression param = Expression.Parameter(typeof(T));
Expression[] array = typeof(T).GetProperties()
.Where(p => p.Name.StartsWith("input") || p.Name.StartsWith("output"))
.OrderBy(p => p.Name)
.Select(p => (Expression)Expression.Property(Expression.Property(param, p), "Value"))
.ToArray();
Expression body = Expression.NewArrayInit(typeof(Double), array);
return Expression.Lambda<Func<T, Double[]>>(body, param);
}
我建议这样做:
static Expression<Func<T, double[]>> DoublePropertiesSelector<T>()
{
var data = Expression.Parameter(typeof(T));
return Expression.Lambda<Func<T, double[]>>(
Expression.NewArrayInit(typeof(double),
from property in typeof(T).GetProperties()
where property.PropertyType == typeof(double?)
select Expression.Property(Expression.Property(data, property.Name), "Value")),
data);
}
如果您可以接受可能的空引用,以防double?
没有值。