这里介绍反射的简单实用

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. C++ 指针的小知识

    看个小例子: char* fun1(){ char * p = (char*)malloc(100); p = "helloww"; return p;} void fun2(ch ...

  2. python + selenium - selenium简介

    1. 产品简介 selenium 是 基于 web网页的UI自动化测试框架. 1)支持多浏览器操作:ie.chrome.firefox.edge.safaria等 2)跨平台:windows.linu ...

  3. Python中__get__ ,__getattr__ ,__getattribute__用法与区别?

    class C(object): a = 'abc' def __getattribute__(self, *args, **kwargs): print("__getattribute__ ...

  4. hdu 2665 划分树模板题(可作为模板)

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. 【Kubernetes】The connection to the server <master>:6443 was refused - did you specify the right host or port?

    不知道怎么用着用着,使用kubectl 时报错,错误如下: root@R740--:~# kubectl get pod The connection to the server 107.105.13 ...

  6. Welcome-to-Swift-01基础部分

    Swift 是 iOS 和 OS X 应用开发的一门新语言.然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 Swift 的很多内容都是你熟悉的. Swift 的类型是在 C ...

  7. 【bzoj1907】树的路径覆盖 树形dp

    题目描述 输入 输出 样例输入 1 7 1 2 2 3 2 4 4 6 5 6 6 7 样例输出 3 题解 树形dp 设f[x]表示以x为根的子树完成路径覆盖,且x为某条路径的一端(可以向上延伸)的最 ...

  8. Json操作(汇总)

    利用:com.fasterxml.jackson 原文地址:https://blog.csdn.net/joyous/article/details/9448461 说明:Map转化为Json:创建J ...

  9. 下拉菜单的option的value属性值问题

    下拉菜单的所有option都必须有value值,如果没有value会将标签中间的值传上去: 比如: <span class="el_spans">试卷级别:</s ...

  10. Android上下文Context

    Android上下文Context介绍 在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中时刻的在与它打交道,例如:Service.BroadcastReceiv ...