C# 使用与现有表达式体不同的Lambda签名创建新表达式
有没有可能做到我在这里想要的事情:C# 使用与现有表达式体不同的Lambda签名创建新表达式,c#,lambda,expression,func,C#,Lambda,Expression,Func,有没有可能做到我在这里想要的事情: namespace ExpressionProblem { class Program { private static readonly List<dynamic> Items = new List<dynamic> { new { Name = "Foo" }, new { Name = "Bar" } };
namespace ExpressionProblem
{
class Program
{
private static readonly List<dynamic> Items = new List<dynamic>
{
new { Name = "Foo" },
new { Name = "Bar" }
};
static void Main()
{
var result = DoSomething<Item>(p => p.Name == "Foo");
Console.WriteLine(result.Name);
}
static T DoSomething<T>(Expression<Func<T, bool>> expression)
{
//change expression lambda from Func<T, bool> to Func<dynamic, bool> so below will compile and work
return Items.FirstOrDefault(expression);
}
}
public class Item
{
public string Name { get; set; }
}
}
基本上,我需要取给定的表达式,它有一个签名
Expression<Func<T, bool>>
以及执行相同操作但具有签名的get和expression
Expression<Func<dynamic, bool>>.
这可能吗?从我读到的内容来看,我认为你不能改变现有的表达式,因为我研究过的大多数地方都说,你基本上必须从现有的表达式中构建一个新的表达式。我试着做到以下几点:
var newExpression = Expression.Lambda<Func<dynamic, bool>>(expression.Body);
…但在尝试创建新表达式时,我收到错误消息:为lambda声明提供的参数数量不正确
关于如何让这项工作发挥作用,或者我正在尝试做一些不能或不应该做的事情,有什么想法吗
提前感谢您提供的任何帮助
问候,
克雷格
[编辑]-我知道有些人会问我为什么不只列出项目类型-在我的特殊情况下,我无法这样做,因为要查询的列表将位于不知道项目类型的应用程序域中。为了简洁起见,我只是将其包含在同一名称空间/类中。[/EDIT]可能与@CK1重复关于您的编辑注释,任何处理该函数结果的操作都隐式了解该类型,或者至少了解该类型的各个方面。您可以使用一个公共接口或父类型以及一组简化的字段在两个域之间共享信息;我无法将列表强制转换为任何内容,因为我没有要强制转换的类型信息。请参阅上面的编辑。如果我正确理解了问题,而我可能不理解,那么你想要的是不可能的。表达式树禁止包含动态操作。如果您试图转换为动态以外的任何类型,则可以通过编程方式重写表达式。但不是动态的。