C# 反射实例
1、接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace PlugDemo
{
public interface IPlugToText
{
string ProccessText(string text);
}
}
2、菜单属性Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace PlugDemo
{
public class MenuNameAttribute:Attribute
{
private string _name; public string Name
{
get { return _name; }
set { _name = value; }
} public MenuNameAttribute(string name)
{
this._name = name;
} }
}
3、实现接口的实现类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ComPlugDemo
{
[PlugDemo.MenuName("转小写")]
public class PlugToLower : PlugDemo.IPlugToText
{
#region IPlugToText 成员 public string ProccessText(string text)
{
return text.ToLower();
} #endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ComPlugDemo
{
[PlugDemo.MenuName("转大写")]
public class PlugToUpper:PlugDemo.IPlugToText
{ #region IPlugToText 成员 public string ProccessText(string text)
{
return text.ToUpper();
} #endregion
}
}
4、反射机制:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.IO;
using PlugDemo; namespace 插件Demo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
AddPlugMenu();
} void AddPlugMenu()
{
//1、加载正在运行的程序集的物理路径
Assembly ass = this.GetType().Assembly; string location = ass.Location; //2、获取 程序集所在文件夹,并转成 插件程序集文件夹的路径
string assDir = Path.GetDirectoryName(location); string plugDir = assDir + "\\plugs"; //3、扫描 产检文件夹里的 所有程序集文件
string [] dllPaths = Directory.GetFiles(plugDir,"*.dll"); //重点: 获取插件接口 类型对象 //4、遍历程序集文件路径,并加载程序家到内存中
Type iplugType = typeof(IPlugToText); foreach (string dllPath in dllPaths)
{
//4.1 、根据路径 加载程序集文件 到内存中
Assembly amy = Assembly.LoadFrom(dllPath); //4.2 、判断程序集中是否有插件类
//4.2.1、获取插件程序集里公有的类
Type[] types = amy.GetExportedTypes();
//4.2.2 循环遍历 插件程序集里的类型 ,判断是否实现记事本插件接口
foreach (Type t in types)
{
//判断 t 是否 实现了接口 IPlugToUpper
if (iplugType.IsAssignableFrom(t))
{
//重要,获取的MenuNameAttribute 特性对象,或将 内部的Name现在到菜单中
object[] atts = t.GetCustomAttributes(typeof(MenuNameAttribute),false);
MenuNameAttribute menuName = atts[] as MenuNameAttribute; //重要:根据插件类型,创建 插件类 对象
IPlugToText iplug = Activator.CreateInstance(t) as IPlugToText; ToolStripMenuItem item = new ToolStripMenuItem(menuName.Name); plugMenu.DropDownItems.Add(item); item.Click += new EventHandler(item_Click); item.Tag = iplug;
}
}
} } void item_Click(object sender, EventArgs e)
{
ToolStripMenuItem item = sender as ToolStripMenuItem; IPlugToText iplug = item.Tag as IPlugToText;
textBox1.Text = iplug.ProccessText(textBox1.Text);
}
}
}
C# 反射实例的更多相关文章
- ObjectTools反射实例
ObjectTools反射实例 package com.shitou.deposit.chinapnr.utils; import org.apache.commons.logging.Log; im ...
- 类的反射实例(servlet的抽取)
类的反射实例 具体以后我们写的时候不用写BaseServlet,因为各种框架都已经给我们写好了 所以,user对应的servlet的界面长这样:
- C#反射实例应用--------获取程序集信息和通过类名创建类实例
AppDomain.CurrentDomain.GetAssemblies();获取程序集,但是获取的只是已经加载的dll,引用的获取不到. System.Reflection.Assembly.Ge ...
- PHP API反射实例
*反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用.其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言.php反射api由若干类组成,可帮助我们用来 ...
- java反射 实例
首先介绍几个概念: 1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时对象所属的类 2)可以判断运行时对象所具有的成员变量和方法 3)通过反 ...
- c# 类的反射实例 (GetType().Invoke().GetMethod().CreateInstance())
原文:http://www.cnblogs.com/chenwei19/archive/2009/02/04/1384034.html Class1和Form 窗体在同一个命名空间 using Sys ...
- C#反射实例(一) 利用反射使用类库
在网上查找了不少的资料,可以说大同小异,概念性的东西网上一搜一堆,今天把反射的东西整理了一下,供大家使用,我保证我这里是最全面的东西,当然也是基础的东西,在学好了这一切的基础上,大家可以学习反射的具体 ...
- Java 反射实例
实体类:Userpackage com.reflect.model; public class User{ private User(int id, String username, String p ...
- go反射实例
需求分析: 如在rocketmq的网络通信中,所有通信数据包以如下形式传输: (注:rocketmq的java结构体,这里使用了go形式表示) type RemotingCommand struct ...
随机推荐
- MySQL_基础知识
-----基础知识 1.什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库 2.什么是关系型数据库.主键,外键,索引分别是什么? 关系型数据 ...
- shell 学习笔记二
一.break命令 break命令允许跳出所有循环(终止执行后面的所有循环). 下面的例子中,脚本进入死循环直至用户输入数字大于5.要跳出这个循环,返回到shell提示符下,就要使用break命令. ...
- MT【204】离散型最值
(联赛一试2006,14).将2006表示成5个正整数$x_1,x_2,x_3,x_4,x_5$之和.记$S=\sum\limits_{1\le i<j\le5}{x_ix_j}$问:(1) 当 ...
- Dependency Walker使用说明[转]
在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库.现在就让我们走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧! 初窥门径:Windows的基石 随便打开一个系统目录, ...
- hdu3072 Intelligence System (最小树形图?)
题意:给一个有向图,问要从0号点能到达所有点所需要经过路径的最小权值和是多少,然而,若两点强联通,则这两点互相到达不需要花费.保证0号点能到达所有点 tarjan缩点以后直接取每个点入边中花费最小的即 ...
- 【bzoj3532】 Sdoi2014—Lis
http://www.lydsy.com/JudgeOnline/problem.php?id=3532 (题目链接) 题意 给出$n$个数的数列,三个值$a[i],b[i],c[i]$.将其中一些数 ...
- Centos6.5使用yum安装mysql
0. 说明 先要查看yum源是否有你想要的mysql版本 yum list | grep mysql 如果没有则先要更新yum源 yum -y update 更新后即可进行下一步操作. 1. yum安 ...
- AtCoder Regular Contest 067 F - Yakiniku Restaurants
题意: 有n个餐厅排成一排,第i个与第i+1个之间距离是Ai. 有m种食物,每种食物只能在一个餐厅里吃,第j种食物在第i个餐厅里吃的收益是$b[i][j]$. 选择每种食物在哪个餐厅里吃,使收益减去走 ...
- HDU 1074 Doing Homework (动态规划,位运算)
HDU 1074 Doing Homework (动态规划,位运算) Description Ignatius has just come back school from the 30th ACM/ ...
- .net Forms身份验证不能用在应用的分布式部署中吗?
参照网上的一些方法,使用Forms身份验证对应用进行分布式部署,发现没有成功. 应用部署的两台内网服务器:192.168.1.19,192.168.1.87,使用Nginx做负载分配,配置完全相同:每 ...