反射 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的优势.本 ...
随机推荐
- 程序员必需知道的windows快捷键
系统操作的快捷键 1.F5------刷新 2.window+E------打开我的电脑 3.window+r------打开运行 4.window+l------快速锁机 5.window+d--- ...
- 老男孩全栈python学习进程表
老男孩Python高级全栈开发工程师-1 0001.开学典礼_ALEX简介 00:55:53 ☆ 0002.职业生涯_来培训的目的 01:12:29 ☆ 0003.课程目标 00:29: ...
- bat 中的特殊符号输出问题
系统关键字(感叹号!)冲突 由于是自动化部署,因此需要使用到循环,这里就不可避免的用到了延迟变量(setlocal enabledelayedexpansion) 有关延迟变量的知识,大家可以通过这篇 ...
- CMMI5
了解CMMI5是什么? 这种解决问题的思想很有用.
- iOS学习笔记48-Swift(八)反射
一.Swift反射 所谓反射就是可以动态获取类型.成员信息,在运行时可以调用方法.属性等行为的特性. 在使用OC开发时很少强调其反射概念,因为OC的Runtime要比其他语言中的反射强大的多.不过在S ...
- BZOJ1189 [HNOI2007]紧急疏散evacuate 【二分 + 网络流】
题目 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以从 ...
- BZOJ1880 [Sdoi2009]Elaxia的路线 【最短路 + dp】
题目 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提 ...
- Echarts学习总结(一)-----柱状图
简介 ECharts,缩写来自Enterprise Charts,商业级数据图表,基于[HTML5]Canvas (ZRender),纯Javascript图表库,是百度的一个开源的数据可视化工具,业 ...
- 【SCOI2003】【BZOJ1092】蜘蛛难题
有一堆管道,还有一个蜘蛛Willy,如下图所示.所有管道的是上端开口,下端封底,直径都是1cm,连接两个管道的连接容量无限,但体积可以忽略不计. 在第一个管道上方有一个水源,从中有水不断往下流,速度为 ...
- PHP中的验证码类(验证码功能设计之一)
<!--vcode.class.php内容--> <?php class Vcode { private $width; //宽 private $height; //高 priva ...