Expression.Bind()方法的应用

使用ExpressionTree在C#中创建对象实例的高效方法
本文介绍了在C#中利用ExpressionTree创建对象实例的方法,并通过示例展示了如何将表达式代码转化为创建对象的过程。强调了ExpressionTree在解决特定问题时的便利性,并分享了个人学习过程中的心得。
介绍:

C# 中反射有 3 种方式去实现:Emit,Expression Tree,Activator。那么他们的性能也跟我的书写顺序是一样的,最前面的Emit是最快的,Expression Tree次之,Activator最慢。

下面通过Expression Tree创建一个对象的实例:

public class Person
{
    public int P_Id { get; set; }
    public String P_Name { get; set; }
    public String P_Tag { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        var p = Expression.Parameter(typeof(String), "name");
        var newExp = Expression.New(typeof(Person));
        var bindsExp = new[]{
            Expression.Bind(typeof(Person).GetProperty("P_Name"),p)
       //这个地方还可以写 Person 类的其它属性,本示例只写了一个 };
var body = Expression.MemberInit(newExp, bindsExp); var func = Expression.Lambda<Func<String, Person>>(body, new[] { p }).Compile(); var person = func("JRoger"); Console.WriteLine(person.GetType() == typeof(Person)); // True Console.ReadKey(true); } }

其中 func("JRoger") 就是为 P_Name 属性赋值。上面的表达式代码相当于:

name => new Person { P_Name = name }

C# 中的表达式树相对比较难学一点,但是多用、多看、多总结,总会从中慢慢体会出来各个成员的作用及用法。很多地方用表达式树去解决是非常方便的。今天写这个也是因为看Enterprise Library 6.0源代码从中学到的 ReflectionRowMapper<TResult> 类。

转载于:https://www.cnblogs.com/jRoger/articles/3557348.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值