程序效果图 :
C#反射
反射提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。
C#特性——Description
指定属性或事件的说明。
这个范例是我写反射工具类突然想到的,原理是通过Assembly类获得程序集中所有的类,筛选继承于Form(窗口类)的类,实际也不复杂,步骤和代码如下:
1.新建一个winform程序集
我这边的程序集名称:zs,下面三个窗口类,主窗体main.cs。框架.NET Framework 4.5.2。.NET4.0没有GetCustomAttribute<T>方法,只能用GetCustomAttributes去获取特性
2.窗体布局
Main.cs分了两个容器,panel2中放置listview,我的程序效果图做了布局,这里就不解释布局了,这边窗体里面扔一个listview就够了。Form1和Form2仅仅用作展示。无布局。
3.添加特性说明
分别在Form1与Form2中添加Description说明。
[Description("这是建立的第一个没毛用的窗体")]
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
[Description("打工稳赚不赔")]
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
}
4.反射与特性获取
Main窗体加载时获取所有符合条件的类显示到listview
这一步就可以得到所有窗体对象,和对应的描述特性,这边Main窗体没有加描述特性,所以特性为空。显示效果如下。
最后给listview添加ItemActivate事件触发。双击listview中的项时打开窗体。
/// <summary>
/// 被激活时
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void listView1_ItemActivate(object sender, EventArgs e)
{
string selText = listView1.SelectedItems[0].Text; //获取选中的类全名
Type ty = assembly.GetType(selText); //得到Type
object ob = Activator.CreateInstance(ty); //实例化对象
((Form)ob).Show();
}