这里介绍反射的简单实用

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. 序列化 pickle & json & shelve

    把内存数据转成字符,叫序列化,dump,dumps 把字符转成内存数据类型,叫反序列化load,loads dumps:仅转成字符串 dump不仅能把对象转换成str,还能直接存到文件内 json.d ...

  2. 缓存淘汰算法之FIFO

    前段时间去网易面试,被这个问题卡住,先做总结如下: 常用缓存淘汰算法 FIFO类:First In First Out,先进先出.判断被存储的时间,离目前最远的数据优先被淘汰. LRU类:Least ...

  3. Concept with HTTP API && RPC

    RPC=Remote Produce Call 是一种技术的概念名词. HTTP是一种协议,RPC可以通过HTTP来实现,也可以通过Socket自己实现一套协议来实现.所以楼主可以换一个问法,为何RP ...

  4. tomcat(不仅仅是tomcat)通过熵池解决在linux启动应用慢

    tomcat启动过程中报错 -Jul- ::] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web applica ...

  5. iOS----闪退,无报错原因,经典解决方案

    在iOS开发时,有时候遇到libc++abi.dylib handler threw exception这样的异常,  虽然在断点出加上了All Exceptions,也断到相应的代码了,但是没打印对 ...

  6. iOS学习笔记32-iCloud入门

    一.iCloud云服务 iCloud是苹果提供的云端服务,用户可以将通讯录.备忘录.邮件.照片.音乐.视频等备份到云服务器并在各个苹果设备间直接进行共享而无需关心数据同步问题,甚至即使你的设备丢失后在 ...

  7. POJ——3061Subsequence(尺取法或二分查找)

    Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11224   Accepted: 4660 Desc ...

  8. Educational Codeforces Round 10——B. z-sort

    B. z-sort time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...

  9. CTSC 1999 家园 【网络流24题】星际转移

    直接把每一个点,每一天拆成一个点. 然后每个点到下一天连$inf$的边. 然后把飞船的路径用容量为飞船容量的边连接. 然后跑网络流判断是否满流. #include <queue> #inc ...

  10. BZOJ2302 [HAOI2011]Problem c 【dp】

    题目 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了,就尝试ai+1,a ...