纸上得来终觉浅,绝知此事要躬行。

 

Expression.Bind()方法的应用

介绍:

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> 类。

posted on 2014-02-20 12:03  JRoger  阅读(1069)  评论(0编辑  收藏  举报

导航