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