你可以考虑这么一个场景:自己实现对象的字段拷贝,这个时候也是已知的类
初踏入开发反射的使用不多
写框架或者基础服务的情况下,这种会常用,比如从json字符串反序列化成一个对象类,fastjson jackson等等这些库,都是使用这种方式
需要根据类名实例化对象或者是根据属性名称从一个对象里取值时。比如根据模板生成word文件,我可能在模板里标记了A,生成word时要从一个对象里取属性名称为A的属性的值来代替模板里的A。
能说详细一点吗?我不明白你说的这个场景下为什么不能直接用new实例化对象
@白鲟: 等你用到的时候自然就懂了,不用纠结
借#2, #3 出一个面试题, 感觉做完这2题应该能对反射理解的差不多了.
实现一个json序列化方法
string SerializeToJson<T>(T obj);
class A{string FieldA; }
class B:A{string FieldA; string FieldB}
//输出例子
SerializeToJson(new A(){FieldA="ABC"}) ==> {"FieldA":"ABC"}
SerializeToJson(new B(){FieldA="ABC", FieldB="DEF"}) ==> {"FieldA":"ABC", "FieldB":"EDF"}
实现一个模板解析方法
string Parser<T>(string template, T obj)
输出例子
Parser("MyTemplatestring '{FieldA}' done.", new A(){FieldA="ABC"})
==>
MyTemplatestring 'ABC' done.
Parser("MyFieldA is {FieldA}, balalala MyFieldA is '{FieldB}'", new B(){FieldA="ABC", FieldB="DEF"})
==>
MyFieldA is ABC, balalala MyFieldA is 'DEF'
结果是对了,还请大佬帮忙看下语法有没有什么不对的地方
举个例子,你编写了一个winform的应用程序,然后某一天,老板说,增加一个功能模块 1234,然后由于现有程序大家都在用,所以在不影响现有程序的情况下,作为一个插件,加入到现有程序,这样现有程序就多了一个模块,那么如何在现有程序运行的前提下,通过插件的方式加入呢?那就用到了反射。
四个字 简化代码
举例的时候自然举已知的类或者程序集让你对照嘛。
实际使用中,如果涉及对一些未知Class或者Assembly的解析,就要用到反射了。
因为需要进一步抽象,类级别的抽象只能抽象到类和实例,字段级别的抽象能到key,value,其中key为字段名称,value为字段值。