当前位置:  开发笔记 > 编程语言 > 正文

C#如何将Expression <Func <SomeType >>转换为Expression <Func <OtherType >>

如何解决《C#如何将Expression<Func<SomeType>>转换为Expression<Func<OtherType>>》经验,为你挑选了1个好方法。

我之前使用过基于lamdas的C#表达式,但我没有手工编写它们的经验.鉴于Expression> originalPredicate,我想创建一个Expression> translatedPredicate.

在这种情况下,SomeType和OtherType具有相同的字段,但它们不相关(没有继承而不是基于公共接口).

背景:我有一个基于LINQ to SQL的存储库实现.我将LINQ to SQL实体投影到我的Model实体,以便将我的模型保存在POCO中.我想将表达式传递给存储库(作为规范的一种形式),但它们应该基于模型实体.但我无法将这些表达式传递给数据上下文,因为它需要基于LINQ to SQL实体的表达式.



1> Marc Gravell..:

有了Expression,最简单的方法是使用转换表达式:

class Foo {
    public int Value { get; set; }
}
class Bar {
    public int Value { get; set; }
}
static class Program {
    static void Main() {
        Expression> predicate =
            x => x.Value % 2 == 0;
        Expression> convert =
            bar => new Foo { Value = bar.Value };

        var param = Expression.Parameter(typeof(Bar), "bar");
        var body = Expression.Invoke(predicate,
              Expression.Invoke(convert, param));
        var lambda = Expression.Lambda>(body, param);

        // test with LINQ-to-Objects for simplicity
        var func = lambda.Compile();
        bool withOdd = func(new Bar { Value = 7 }),
             withEven = func(new Bar { Value = 12 });
    }
}

但请注意,不同的提供商将以不同的方式支持此功能.例如,EF可能不喜欢它,即使LINQ-to-SQL也是如此.

另一种选择是重建表达式树完全,使用反射来找到对应的成员.更复杂.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有