从现有表达式主体创建具有不同Lambda签名的新表达式

时间:2014-12-12 16:37:37

标签: c# lambda expression func

是否有可能做我在这里寻找的事情:

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<Func<dynamic, bool>>.  

这甚至可能吗?从我所读过的内容来看,我不认为你可以改变一个现有的表达方式,因为我研究过的大多数地方都说你基本上必须从现有的表达式构建一个新的表达式。我试着做以下事情:

var newExpression = Expression.Lambda<Func<dynamic, bool>>(expression.Body);

...但是我收到错误&#34;为lambda声明提供的参数数量不正确&#34;在尝试创建新表达式时。

有关如何使其发挥作用的任何想法,或者我正在尝试做一些不能(或不应该)做的事情?

提前感谢您提供的任何帮助。

问候,

克雷格

[编辑] - 我知道有些人会问为什么我不会只列出类型项目列表 - 在我的特定情况下我无法查询要查看的列表将在应用程序中不知道Item类型的域。为了简洁起见,我只是将它包含在同一个命名空间/类中。[/ EDIT]

0 个答案:

没有答案