这里介绍反射的简单实用

MyClass类

  1. public class MyClass
  2. {
  3. public int Age { get; set; }
  4. public string Name { get; set; }
  5.  
  6. public MyClass()
  7. {
  8. Console.WriteLine("无参数的构造函数");
  9. }
  10.  
  11. public MyClass(string name)
  12. {
  13. this.Name = name;
  14. Console.WriteLine("有参数的构造函数");
  15. }
  16.  
  17. public string GetUpperString(string str)
  18. {
  19. return str.ToUpper();
  20. }
  21.  
  22. private void PrivateMethod()
  23. {
  24. Console.WriteLine("PrivateMethod");
  25. }
  26. }

Type typeof

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Type typeMyClass = typeof(MyClass);
  6.  
  7. //获取方法
  8. MethodInfo methodinfo = typeMyClass.GetMethod("GetUpperString");
  9. object result = methodinfo.Invoke(Activator.CreateInstance(typeMyClass), new object[] { "namesss to upper" });
  10. Console.WriteLine(result);//NAMESSS TO UPPER
  11.  
  12. //调用有参数的构造函数
  13. ConstructorInfo ctorInfo = typeMyClass.GetConstructor(new Type[] { typeof(string) });
  14. //ctorResult 是MyClass 对象
  15. object ctorResult = ctorInfo.Invoke(new object[] { "namess" });
  16. Console.WriteLine(ctorResult);//反射3.Myclass
  17.  
  18. //获得 属性
  19. PropertyInfo pInfo = typeMyClass.GetProperty("Name");
  20. object names = pInfo.GetValue(Activator.CreateInstance(typeMyClass));
  21. Console.WriteLine(names);
  22.  
  23. PropertyInfo[] pinfos = typeMyClass.GetProperties();
  24.  
  25. Console.Read();
  26. }
  27. }

动态加载程序集

  1. Assembly assembly = Assembly.LoadFile("");
  2. Type[] types = assembly.GetTypes();
  3. ///获得指定的类型
  4. Type type = assembly.GetType("空间名.类名");
  5.  
  6. //这里是找方法名是MethodName,私有的 或者静态的方法
  7. MethodInfo minfo= typeMyClass.GetMethod("MethodName", BindingFlags.NonPublic | BindingFlags.Static);

2.反射还有一个作用,动态加载插件

要实现插件功能,首先 原程序要有一个接口,来规范插件

插件的接口IMyNoteExeInfer  dll代码是

  1. namespace MyNotePadExeInfer
  2. {
  3. /// <summary>
  4. /// 接口默认不是public
  5. /// </summary>
  6. public interface IMyNoteExeInfer
  7. {
  8.  
  9. /// <summary>
  10. /// 插件的名称
  11. /// </summary>
  12. string name
  13. {
  14. get;
  15. set;
  16. }
  17. /// <summary>
  18. /// 运行插件
  19. /// </summary>
  20. /// <param name="txt">textbox的插件</param>
  21. void Run(TextBox txt);
  22. }
  23. }

接着是 原程序要根据接口,动态加载(未来未知的)插件

  1. private void Form1_Load(object sender, EventArgs e)
  2. {
  3. //加载插件
  4. //1. 找到多个控件的文件路径
  5. Assembly ass = Assembly.GetExecutingAssembly();
  6. ///规定好把插件放到执行目录的 addnotedll文件夹中
  7. string pathfile = Path.Combine(Path.GetDirectoryName(ass.Location), "addnotedll");
  8. //找到每个插件的绝对路径
  9. string[] filePaths = Directory.GetFiles(pathfile, "*.dll");
  10. foreach (string fileP in filePaths)
  11. {
  12. Assembly oneAssmebly = Assembly.LoadFrom(fileP);
  13. Type[] types = oneAssmebly.GetExportedTypes();//获得程序集中的public 类型
  14. //规范插件的接口IMyNoteExeInfer
  15. Type typeNoteInfer = typeof(IMyNoteExeInfer);
  16. for (int i = ; i < types.Length; i++)
  17. {
  18. //挑取实现了接口IMyNoteExeInfer的类型
  19. if (typeNoteInfer.IsAssignableFrom(types[i]) && !types[i].IsAbstract)
  20. {
  21. //创建当前类型的实例
  22. IMyNoteExeInfer currDllInstance = (IMyNoteExeInfer)Activator.CreateInstance(types[i]);
  23.  
  24. //在工具下拉单toolSmiSet中 加入控件
  25. ToolStripItem newAdditem= toolSmiSet.DropDownItems.Add(currDllInstance.name);
  26. newAdditem.Tag = currDllInstance;//把插件对象传过去,这样在那里就可以用对象调方法了
  27. //给新增加的下拉单 注册单击事件
  28. newAdditem.Click +=newAdditem_Click;
  29. }
  30. }
  31.  
  32. }
  33.  
  34. }
  35.  
  36. private void newAdditem_Click(object sender, EventArgs e)
  37. {
  38. //sender就是单击的下拉单
  39. ToolStripItem newitem = (ToolStripItem)sender;
  40. //newitem.Tag传过来的是对象 插件的对象
  41. //因为插件对象都继承接口,所以可以直接用接口接受
  42. IMyNoteExeInfer iexeInfer= (IMyNoteExeInfer)newitem.Tag;
  43. iexeInfer.Run(textBox1);//运行插件
  44. }

下面是插件的dll代码

  1. public class MyNoteToUpper : IMyNoteExeInfer
  2. {
  3. /// <summary>
  4. /// 运行插件
  5. /// </summary>
  6. /// <param name="txt"></param>
  7. public void Run(TextBox txt)
  8. {
  9. txt.Text = txt.Text.ToUpper();
  10.  
  11. }
  12. private string _name;
  13. /// <summary>
  14. /// 插件的名字
  15. /// </summary>
  16. public string name
  17. {
  18. get { return "ToUpper"; }
  19. set { _name = value; }
  20. }
  21. }

反射 type 的基本用法,动态加载插件的更多相关文章

  1. .Net动态加载插件-反射

    /// <summary> /// 动态加载插件 /// </summary> void LoadPlugin() { string[] ps = Directory.GetF ...

  2. Java 反射理解(二)-- 动态加载类

    Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编 ...

  3. 页面滚动图片等元素动态加载插件jquery.scrollLoading.js

    如果一个网页很长,那么该页面的加载时间也会相应的较长.而这里给大家介绍的这个jQuery插件scrollLoading的作用则是,对页面元素进行动态加载,通俗的说就是滚到哪就加载到哪,屏幕以下看不见的 ...

  4. Pjax 下动态加载插件方案

    在纯静态网站里,有时候会动态更新某个区域往会选择 Pjax(swup.barba.js)去处理,他们都是使用 ajax 和 pushState 通过真正的永久链接,页面标题和后退按钮提供快速浏览体验. ...

  5. Qt mac QMYSQL(动态加载插件QPluginLoader的用法)

    用此段代码查出问题所在 QPluginLoader loader; loader.setFileName("/Users/danny/Qt5.3.2/5.3/clang_64/plugins ...

  6. java反射动态加载类Class.forName();

    1,所有的new出来的对象都是静态加载的,在程序编译的时候就会进行加载.而使用反射机制Class.forName是动态加载的,在运行时刻进行加载. 例子:直接上两个例子 public class Ca ...

  7. Android中的动态加载机制

    在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...

  8. 【转】Android类动态加载技术

    http://www.blogjava.net/zh-weir/archive/2011/10/29/362294.html Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的 ...

  9. Android 动态加载 (一) 态加载机制 案例一

    在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...

随机推荐

  1. Spring Cloud(2.0)能力大致列表

    微服务九大特性 出自Martin Fowler的<Microservices> 服务组件化 按业务组织团队 做"产品"的态度 智能端点与哑管道 去中心化治理 去中心化管 ...

  2. Python 爬取图书图片和地址

    #-*- coding:utf-8 -*- import xlwt import urllib import re def getHtml(url): page = urllib.urlopen(ur ...

  3. ccna 闫辉单臂路由 和 acl access control list

    ccna 闫辉单臂路由 和  acl   access control list 一单臂路由     当前园区网设计很少用到       成本低  小型的.局域网可用         二ACL acc ...

  4. dependency or constituency

    what's dependenct or constituency involved in a sentence? In linguistics, when it comes to sentence ...

  5. 编绎调试HotSpot JVM及在Eclipse里调试HotSpot一些步骤

    编绎整个OpenJDK要很久,而且有很多东西是不需要的.研究HotSpot的话,其实只要下HotSpot部分的代码就可以了. 下面简单记录下编绎调试HotSpot一些步骤. 一.编绎 进入hotsop ...

  6. TOJ4277: Sequence 组合数学

    4277: Sequence Time Limit(Common/Java):2000MS/6000MS     Memory Limit:65536KByte Total Submit: 39   ...

  7. 【转】参照protobuf,将json数据转换成二进制在网络中传输。

    http://blog.csdn.net/gamesofsailing/article/details/38335753?utm_source=tuicool&utm_medium=refer ...

  8. java jstl标签

    转自:http://blog.csdn.net/liushuijinger/article/details/9143793 JSTL(JSP Standard Tag Library ,JSP标准标签 ...

  9. Python 数据库到处到Excel

    import MySQLdb import xlwt def outMySQL(file_name): wb = xlwt.Workbook() sh = wb.add_sheet('sheet 1' ...

  10. 【bzoj2333】[SCOI2011]棘手的操作 可并堆+STL-set

    UPD:复杂度是fake的...大家还是去写启发式合并吧. 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条 ...