代替Reflection(反射)的一些方法(转)
作者:JustRun
林肯: http://www.cnblogs.com/JustRun1983/p/3830764.html
2014-07-08 08:00 by JustRun, 3942 阅读, 26 评论, 收藏, 编辑
我们首先创建一个Person类,这个类非常简单,一个Name的public属性,一个_age的私有变量。完整代码如下:
public string Name { get; set; }
接下来,看看常规的使用reflection获取一个person对象公开属性,私有变量同时调用对象的方法:
var property = type.GetProperty("Name");//根据名称获取类型属性
Console.WriteLine(property.GetValue(p).ToString());//获取对象的属性值
Console.WriteLine(field.GetValue(p));
Console.WriteLine(guessResult);
var privateObject = new PrivateObject(p);
Console.WriteLine(privateObject.GetProperty("Name"));
Console.WriteLine(privateObject.GetField("_age"));
Console.WriteLine(privateObject.Invoke("GuessAge", new object[] { 20 }));
上面的代码和使用Reflection的效果完全一样。是不是觉得整个世界都清净许多。在代码的可读性上面,比Reflection好不少。
使用动态类型,可以非常简单方便的访问对象的属性的方法,比如上面的代码,如果我用dynamic实现:
Console.WriteLine(person.Name);
//Console.WriteLine(person._age);
Console.WriteLine(person.GuessAge(20));
使用dynamic不能访问私有成员的问题,在Exposed里得到完全解决,从名字(翻译成暴露)也能看出来,它就是干这个的。
var exposedObj = Exposed.From(p);
Console.WriteLine(exposedObj.Name);
Console.WriteLine(exposedObj._age);
Console.WriteLine(exposedObj.GuessAge(20));
Exposed是第三方开源的,项目地址是https://github.com/Cognifide/ExposedObject,也可以在nuget中下载到。
5. 大杀器Clay
看到上面的"废话",动态语言的爱好者只会冷笑一下,丑陋的静态编译语言,这些东西在动态语言里面,"这都不是事"。好吧,我承认,但是看完了Clay,也许能改变你的看法。
dynamic New = new ClayFactory();
var person = New.Person().Name("Louis")._age(30);
person.GuessAge = new Func<int, bool>(x => x == person._age);
Console.WriteLine(person.Name);
Console.WriteLine(person._age);
Console.WriteLine(person.GuessAge()(20));
跟多的了解Clay,可以看这篇http://www.cnblogs.com/JustRun1983/p/3529157.html