C# 用子lambda表达式扩展lambda表达式

C# 用子lambda表达式扩展lambda表达式,c#,lambda,expression,C#,Lambda,Expression,我试图弄清楚是否可以组合2个lambdaexpression,其中一个lambda表达式使用第一个的子属性 考虑到以下两类: class MyClass { public string Name { get; set; } public SubClass Child { get; set; } } class SubClass { public string SubClassName { get; set; } } 以及下列用语: Expression<Func

我试图弄清楚是否可以组合2个lambdaexpression,其中一个lambda表达式使用第一个的子属性

考虑到以下两类:

class MyClass
{
    public string Name { get; set; }
    public SubClass Child { get; set; }
}

class SubClass
{
    public string SubClassName { get; set; }
}
以及下列用语:

Expression<Func<MyClass, bool>> Expression1 = c => c.Name == "Test";

Expression<Func<SubClass, bool>> Expression2 = sc => sc.SubClassName == "SubTest";
Expression1=c=>c.Name==“Test”;
表达式Expression2=sc=>sc.SubClassName==“SubTest”;
我想将其合并为以下类型的lambda:

Expression<Func<MyClass, bool>> Combined;
表达式组合;
原因是:上lambda是内部的,下lamba将由方法的“用户”传入,该用户不知道(也不应该)MyClass存在,只知道子类


这是可能的,还是我应该另找一条路走?

我不知道这是否正是你想要的,但是

public class Search
{
    private IEnumerable<MyClass> _data;

    public Search(IEnumerable<MyClass> data)
    {
        _data = data;
    }

    public IEnumerable<MyClass> Find(Expression<Func<SubClass, bool>> expr)
    {
        ParameterExpression x = Expression.Parameter(typeof(MyClass), "x");
        PropertyInfo p = typeof(MyClass).GetProperty("Child");

        var propertyExpression = (expr.Body as BinaryExpression).Left as MemberExpression;
        var constant = (expr.Body as BinaryExpression).Right;

        var memberAccess = Expression.MakeMemberAccess(x, p);
        var upperMemberAccess = Expression.MakeMemberAccess(memberAccess, propertyExpression.Member);

        var equals = Expression.Equal(upperMemberAccess, constant);

        var expression = Expression.Lambda<Func<MyClass, bool>>(equals, x);

        return _data.Where(expression.Compile());
    }
}

我确信有更好的方法可以做到这一点,因为这感觉很笨拙,但基本上它会发现MyClass的所有成员都有一个名为“subclass”的子类。它提取二进制表达式的组件(x=>x.SubClassname==“Subclass”),并使用基于等于的MyClass重新构建一个新表达式

他们怎么可能不知道您的类,结果lambda必须看起来像x.Child.SubClassName==“SubTest”,因为您必须从MyClassFind(表达式)导航,这就是将公开的内容。但是在内部,我需要表达式形式的lambda
var search = new Search(new[] {
        new MyClass { Name = "Test 1", Child = new SubClass { SubClassName = "Bob" }},
        new MyClass { Name = "Test 2", Child = new SubClass { SubClassName = "Subclass"}},
        new MyClass { Name = "Test 3", Child = new SubClass { SubClassName = "Subclass"}}
    });

    search.Find(k => k.SubClassName == "Subclass");