其他分享
首页 > 其他分享> > CodeGo.net>如何创建表达式树,返回基于约定的受限属性?

CodeGo.net>如何创建表达式树,返回基于约定的受限属性?

作者:互联网

我需要创建一个表达式树,返回Expression< Func< TDataStructure,Double []>表达.棘手的是,TDataStructure是通用的,这意味着每个传递的类都包含不同的属性集.我需要获取Double类型的属性吗?以及以特定字符串开头的名称,例如“输出”.

简单示例案例(具体类):

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类型的这些,以“输出”开头
>表达式将在IQueryable< TDataStructure>中使用.用于将每个序列元素投影到新形式的选择方法.

解决方法:

尝试这个:

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);
}

标签:c,lambda,expression-trees
来源: https://codeday.me/bug/20191026/1939489.html