介绍:
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>(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> 类。