我想创建通过查询获取项目的存储库模式类。不幸的是我需要将这个查询从一个类解析到另一个类(Picture to ListItem)以将其发送到服务器(api)。所以,我的代码应该看起来像如下:将表达式<Func <XClass,object >>转换为表达式<Func <YClass,object >>
public static void ConvertQuery(Expression<Func<Picture, object>> oldQuery)
{
Expression<Func<ListItem, object>> newQuery = convert(oldQuery);
}
而且,例如,我想旧的查询通过编制属性像下面转换:
- SomePicture.Id => SomeListItem.Id
- SomePicture .FileName => SomeListItem [“FileName”]
我发现了一些解决方案,我可以投射属性。但最大的问题是铸造一个属性字典场(item1.Filename ITEM2的。[“文件名”])
更新
@nejcs
我试图使用你的解决方案但不幸的是我有例外:
System.ArgumentException:Microsoft.SharePoint.Client.ListItem“型 的ParameterExpression'不能用于典型的代表 参数e'CastExpression.Picture''
属性“Item”负责字典值,但我认为转换存在问题。下面是堆栈跟踪:
在System.Linq.Expressions.Expression.ValidateLambdaArgs(类型 delegateType,表达&体,ReadOnlyCollection 1个参数)在 System.Linq.Expressions.Expression.Lambda [TDelegate](式体, 字符串名称,布尔尾调用,IEnumerable的1个参数)在 System.Linq.Expressions.Expression 1.Update(式体, IEnumerable`1参数)在 System.Linq.Expressions.ExpressionVisitor.VisitLambda [T](式1 node)at System.Linq.Expressions.Expression 1.Acept(ExpressionVisitor visitor) 在System.Linq.Expressions.ExpressionVisitor.Visit(Expression节点)
在CastExpression.Program.Main(字串[] args)
我也知道身体表达怎么看起来像
对于oldClassQuery:
Expression<Func<Picture, object>> oldQuery = x => x.FileName == "AS";
{X =>转换((x.FileName == “AS”))}
对于newClassQuery:
Expression<Func<ListItem, object>> newQuery = x => x["FileName"] == "AS";
{X =>转换((X。get_Item(“FileName”)==“AS”))}
您的解决方案是使用'ExpressionVisitor'并手动重写表达式树。 –
我更新了有关您收到的例外的答案。 – nejcs