反射 type 的基本用法,动态加载插件
这里介绍反射的简单实用
MyClass类
- public class MyClass
- {
- public int Age { get; set; }
- public string Name { get; set; }
- public MyClass()
- {
- Console.WriteLine("无参数的构造函数");
- }
- public MyClass(string name)
- {
- this.Name = name;
- Console.WriteLine("有参数的构造函数");
- }
- public string GetUpperString(string str)
- {
- return str.ToUpper();
- }
- private void PrivateMethod()
- {
- Console.WriteLine("PrivateMethod");
- }
- }
Type typeof
- class Program
- {
- static void Main(string[] args)
- {
- Type typeMyClass = typeof(MyClass);
- //获取方法
- MethodInfo methodinfo = typeMyClass.GetMethod("GetUpperString");
- object result = methodinfo.Invoke(Activator.CreateInstance(typeMyClass), new object[] { "namesss to upper" });
- Console.WriteLine(result);//NAMESSS TO UPPER
- //调用有参数的构造函数
- ConstructorInfo ctorInfo = typeMyClass.GetConstructor(new Type[] { typeof(string) });
- //ctorResult 是MyClass 对象
- object ctorResult = ctorInfo.Invoke(new object[] { "namess" });
- Console.WriteLine(ctorResult);//反射3.Myclass
- //获得 属性
- PropertyInfo pInfo = typeMyClass.GetProperty("Name");
- object names = pInfo.GetValue(Activator.CreateInstance(typeMyClass));
- Console.WriteLine(names);
- PropertyInfo[] pinfos = typeMyClass.GetProperties();
- Console.Read();
- }
- }
动态加载程序集
- Assembly assembly = Assembly.LoadFile("");
- Type[] types = assembly.GetTypes();
- ///获得指定的类型
- Type type = assembly.GetType("空间名.类名");
- //这里是找方法名是MethodName,私有的 或者静态的方法
- MethodInfo minfo= typeMyClass.GetMethod("MethodName", BindingFlags.NonPublic | BindingFlags.Static);
2.反射还有一个作用,动态加载插件
要实现插件功能,首先 原程序要有一个接口,来规范插件
插件的接口IMyNoteExeInfer dll代码是
- namespace MyNotePadExeInfer
- {
- /// <summary>
- /// 接口默认不是public
- /// </summary>
- public interface IMyNoteExeInfer
- {
- /// <summary>
- /// 插件的名称
- /// </summary>
- string name
- {
- get;
- set;
- }
- /// <summary>
- /// 运行插件
- /// </summary>
- /// <param name="txt">textbox的插件</param>
- void Run(TextBox txt);
- }
- }
接着是 原程序要根据接口,动态加载(未来未知的)插件
- private void Form1_Load(object sender, EventArgs e)
- {
- //加载插件
- //1. 找到多个控件的文件路径
- Assembly ass = Assembly.GetExecutingAssembly();
- ///规定好把插件放到执行目录的 addnotedll文件夹中
- string pathfile = Path.Combine(Path.GetDirectoryName(ass.Location), "addnotedll");
- //找到每个插件的绝对路径
- string[] filePaths = Directory.GetFiles(pathfile, "*.dll");
- foreach (string fileP in filePaths)
- {
- Assembly oneAssmebly = Assembly.LoadFrom(fileP);
- Type[] types = oneAssmebly.GetExportedTypes();//获得程序集中的public 类型
- //规范插件的接口IMyNoteExeInfer
- Type typeNoteInfer = typeof(IMyNoteExeInfer);
- for (int i = ; i < types.Length; i++)
- {
- //挑取实现了接口IMyNoteExeInfer的类型
- if (typeNoteInfer.IsAssignableFrom(types[i]) && !types[i].IsAbstract)
- {
- //创建当前类型的实例
- IMyNoteExeInfer currDllInstance = (IMyNoteExeInfer)Activator.CreateInstance(types[i]);
- //在工具下拉单toolSmiSet中 加入控件
- ToolStripItem newAdditem= toolSmiSet.DropDownItems.Add(currDllInstance.name);
- newAdditem.Tag = currDllInstance;//把插件对象传过去,这样在那里就可以用对象调方法了
- //给新增加的下拉单 注册单击事件
- newAdditem.Click +=newAdditem_Click;
- }
- }
- }
- }
- private void newAdditem_Click(object sender, EventArgs e)
- {
- //sender就是单击的下拉单
- ToolStripItem newitem = (ToolStripItem)sender;
- //newitem.Tag传过来的是对象 插件的对象
- //因为插件对象都继承接口,所以可以直接用接口接受
- IMyNoteExeInfer iexeInfer= (IMyNoteExeInfer)newitem.Tag;
- iexeInfer.Run(textBox1);//运行插件
- }
下面是插件的dll代码
- public class MyNoteToUpper : IMyNoteExeInfer
- {
- /// <summary>
- /// 运行插件
- /// </summary>
- /// <param name="txt"></param>
- public void Run(TextBox txt)
- {
- txt.Text = txt.Text.ToUpper();
- }
- private string _name;
- /// <summary>
- /// 插件的名字
- /// </summary>
- public string name
- {
- get { return "ToUpper"; }
- set { _name = value; }
- }
- }
反射 type 的基本用法,动态加载插件的更多相关文章
- .Net动态加载插件-反射
/// <summary> /// 动态加载插件 /// </summary> void LoadPlugin() { string[] ps = Directory.GetF ...
- Java 反射理解(二)-- 动态加载类
Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编 ...
- 页面滚动图片等元素动态加载插件jquery.scrollLoading.js
如果一个网页很长,那么该页面的加载时间也会相应的较长.而这里给大家介绍的这个jQuery插件scrollLoading的作用则是,对页面元素进行动态加载,通俗的说就是滚到哪就加载到哪,屏幕以下看不见的 ...
- Pjax 下动态加载插件方案
在纯静态网站里,有时候会动态更新某个区域往会选择 Pjax(swup.barba.js)去处理,他们都是使用 ajax 和 pushState 通过真正的永久链接,页面标题和后退按钮提供快速浏览体验. ...
- Qt mac QMYSQL(动态加载插件QPluginLoader的用法)
用此段代码查出问题所在 QPluginLoader loader; loader.setFileName("/Users/danny/Qt5.3.2/5.3/clang_64/plugins ...
- java反射动态加载类Class.forName();
1,所有的new出来的对象都是静态加载的,在程序编译的时候就会进行加载.而使用反射机制Class.forName是动态加载的,在运行时刻进行加载. 例子:直接上两个例子 public class Ca ...
- Android中的动态加载机制
在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...
- 【转】Android类动态加载技术
http://www.blogjava.net/zh-weir/archive/2011/10/29/362294.html Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的 ...
- Android 动态加载 (一) 态加载机制 案例一
在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...
随机推荐
- Spring Cloud(2.0)能力大致列表
微服务九大特性 出自Martin Fowler的<Microservices> 服务组件化 按业务组织团队 做"产品"的态度 智能端点与哑管道 去中心化治理 去中心化管 ...
- Python 爬取图书图片和地址
#-*- coding:utf-8 -*- import xlwt import urllib import re def getHtml(url): page = urllib.urlopen(ur ...
- ccna 闫辉单臂路由 和 acl access control list
ccna 闫辉单臂路由 和 acl access control list 一单臂路由 当前园区网设计很少用到 成本低 小型的.局域网可用 二ACL acc ...
- dependency or constituency
what's dependenct or constituency involved in a sentence? In linguistics, when it comes to sentence ...
- 编绎调试HotSpot JVM及在Eclipse里调试HotSpot一些步骤
编绎整个OpenJDK要很久,而且有很多东西是不需要的.研究HotSpot的话,其实只要下HotSpot部分的代码就可以了. 下面简单记录下编绎调试HotSpot一些步骤. 一.编绎 进入hotsop ...
- TOJ4277: Sequence 组合数学
4277: Sequence Time Limit(Common/Java):2000MS/6000MS Memory Limit:65536KByte Total Submit: 39 ...
- 【转】参照protobuf,将json数据转换成二进制在网络中传输。
http://blog.csdn.net/gamesofsailing/article/details/38335753?utm_source=tuicool&utm_medium=refer ...
- java jstl标签
转自:http://blog.csdn.net/liushuijinger/article/details/9143793 JSTL(JSP Standard Tag Library ,JSP标准标签 ...
- Python 数据库到处到Excel
import MySQLdb import xlwt def outMySQL(file_name): wb = xlwt.Workbook() sh = wb.add_sheet('sheet 1' ...
- 【bzoj2333】[SCOI2011]棘手的操作 可并堆+STL-set
UPD:复杂度是fake的...大家还是去写启发式合并吧. 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条 ...