这里介绍反射的简单实用

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 的基本用法,动态加载插件的更多相关文章

  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. logging模块的作用以及应用场景

    一.python中的logging模块 logging模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统.logging模块是Python的一个标准库模块,由标准库模块提供日志记录AP ...

  2. doc下设置永久环境变量的好方法

    http://www-2w.blog.163.com/blog/static/97931518201021211123267/ 需要查看命令具体实现:setx machine “%path%”. 配置 ...

  3. [git 学习篇] 创建公钥

    http://riny.net/2014/git-ssh-key/ 1 安装 windows gitbash    msysgit是Windows版的Git,从https://git-for-wind ...

  4. Codeforces Round #410 (Div. 2) A. Mike and palindrome

    A. Mike and palindrome time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  5. 测试jsonp

    login<?php $type = $_GET['type']; if(empty($type)) { $url = ""; }else { if($type == 'lo ...

  6. 皮尔逊相关系数的计算(python代码版)

    from math import sqrt def multipl(a,b): sumofab=0.0 for i in range(len(a)): temp=a[i]*b[i] sumofab+= ...

  7. LibreOJ2085 - 「NOI2016」循环之美

    Portal Description 给出\(n,m(n,m\leq10^9)\)和\(k(k\leq2000)\),求在\(k\)进制下,有多少个数值不同的纯循环小数可以表示成\(\dfrac{x} ...

  8. [解决方案]Window 2008 R2 + IIS7.5 + VS2013 错误代码 0x80070002

    HTTP 错误 404.0 - Not Found 您要找的资源已被删除.已更名或暂时不可用.详细错误信息模块 IIS Web Core通知 MapRequest Handler处理程序 Static ...

  9. hdu 4300 kmp算法扩展

    Clairewd’s message Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  10. WebRTC VoiceEngine综合应用示例(一)——基本结构分析(转)

    把自己这两天学习VoiceEngine的成果分享出来,供大家参考,有什么问题也欢迎大家指出,一起学习一起进步. 本文将对VoiceEngine的基本结构做一个分析,分析的方法是自底向上的:看一个音频编 ...