如何根据约定创建返回受限属性集的表达式树

本文关键字:属性 表达式 何根 约定 创建 返回 | 更新日期: 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.Valuestructure.outputProperty1.Valuestructure.outputProperty2.Value属于Double?

我的案例:

  1. 我不知道TDataStructure 中有多少Double?类型的属性

  2. 我只需要得到Double?类型的,从"output" 开始

  3. 表达式将用于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?没有值。