当前位置: 老葡京网站娱乐 > web开发 > ASP.NET > 正文

通用的访问非公有字段(Field)和属性组件

时间:2011-08-06 博客园 阿不

老葡京网站娱乐 www.sdguanhua.com 在Teddy的 DynamicMethodProxyFactory组件中,提供了一种调用非公有方法的机制。本质上,通过这 个组件是可以实现任意的公有和非公有属性的读写操作(属性本质上可以通过它的get/set方法以方法的 形式访问)。而且性能会比反射提高3 - 4数量级。但是如果我们希望访问某些非公有字段时,那我们还 是无法使用DynamicMethodProxyFactory组件,还是需要使用反射。

这时,NonPublicPropertyProxy就派上用场了。这个组件是我根据NBear.Mapping中对属性的读写原理 抽取出来的。由于它仍然是基于IL和CodeGenerator,因此在性能仍然具备DynamicMethodProxyFactory的 特点。

该组件实现的功能,通过代理非常简单的支持对任意实例属性(Property)/字段(Field)的读写,支持 任意静态字段的读写。但不支持静态属性的读写(对静态属性的读写还得通过 DynamicMethodProxyFactory)。

由于该组件会动态组织IL代理函数,因此在首次获取代理方法时,会需要一些性能损失 (DynamicMethodProxyFactory也是如此)。因此如果只需一次读写非公有属性/字段时,还是尽可能选择 其它方式,比如反射。

使用演示:

code 1 设置私有字段值

1 User user = new User();
  2 NonPropertySetterDelegate nameSetter = NonPublicPropertyProxyFactory.GetPropertySetter(typeof(User), "name");
  3 NonPropertySetterDelegate idSetter = NonPublicPropertyProxyFactory.GetPropertySetter (typeof(User), "id");
  4 NonPropertySetterDelegate statusSetter = NonPublicPropertyProxyFactory.GetPropertySetter(typeof(User), "status");
  5 NonPropertySetterDelegate childrenSetter = NonPublicPropertyProxyFactory.GetPropertySetter(typeof(User), "Children");
  6 NonPropertySetterDelegate staticFieldSetter = NonPublicPropertyProxyFactory.GetPropertySetter(typeof(User), "staticValue");
  7
  8 string name = "abu";
  9 nameSetter(user, name);
10          
11 int i = 995006;
12 idSetter(user, i);
13
14 statusSetter(user, UserStatus.Admin);
15
16 List<string> children = new List<string>();
17 childrenSetter(user, children);
18
19 staticFieldSetter(null, 100);
20