我理解的反射,大概就是各种“找找找”。以下“类名”,均为Type类型(由“名称空间.类名”构成)。
- 根据类对象,找到类名。
- 根据一个字符串,找到类名;
- 有了类名,找到它包含的属性、方法。
- 有了类名,还可以创建它的实例。
- 有了3,可以获取类对象的属性值。
会了这几点,应该就算是会了反射。怎么用,就看你自己的理解了。
对于1、3,的应用,例子可以参考另一篇文章。
对于2、4的应用,例子如下:
using System; using System.Reflection; using System.Xml; namespace ConsoleApp1 { class Program { static void Main(string[] args) { String s; XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load("myxml.xml"); //下两行效果相同 //s=xmlDocument.SelectSingleNode("myinput/mynamespace").InnerText s = xmlDocument.GetElementsByTagName("mynamespace")[0].InnerText; s += "."; s+= xmlDocument.GetElementsByTagName("myclass")[0].InnerText; //入口程序集(名称) //Assembly.GetEntryAssembly().GetName().Name; //得到类名,取它所在的程序集,创建对象 var o = (MyClass.MyObject)Type.GetType(s).Assembly.CreateInstance(s); o.show(); } } } namespace MyClass { public interface MyObject { public void show(); } public class Test:MyObject { int x; public Test() { x = 66; } public void show() { Console.WriteLine($"Assembly is {Assembly.GetEntryAssembly().GetName().Name},x={x}"); } } }
使用了xml文档作为配置,取代了通常用到的输入。手痒而已,不重要。
xml需要设置成复制,不然调试的时候找不到。
文档内容如下:
<?xml version="1.0" encoding="utf-8" ?> <myinput> <mynamespace au="hc">MyClass</mynamespace> <myclass>Test</myclass> </myinput>
运行结果:
对于5,部分代码如下:
StringBuilder sb1, sb2; sb1 = new StringBuilder(); sb2 = new StringBuilder(); myt = obj.GetType(); var myps = myt.GetProperties(); foreach (var item in myps) { sb1.Append(item.Name);//属性名 sb2.Append(item.GetValue(obj, null));//字段内容 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现