背景
如何更好的认识反射机制,并如何更好的应用反射机制?
概念
1、反射就是动态发现类型信息的能力。
它帮助程序设计人员在程序运行时利用一些信息去动态地使用类型,这些信息在设计时是未知的,这种能力类型于后期绑定。反射还支持的更高级的行为,能在运行时动态创建新类型,并且对这些新类型的操作进行调用。
2、
可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现 有对象中获取类型。
3、应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。
需求
1、以某个实例为原型,重新生成一个新的实例,并对某些值做调整
2、获取制定类的属性、方法,并调用其方法
实例
1、定义User类,属性大致包括:UserID、UserName、Age、Address、Remark等
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WinFormQandA
{
public class User
{
public string UserID
{
get;
set;
}
public string UserName
{
get;
set;
}
public int Age
{
get;
set;
}
public string Address
{
get;
set;
}
public string Remark
{
get;
set;
}
/// <summary>
/// 用于测试方法调用
/// </summary>
/// <param name="p1"></param>
/// <param name="p2"></param>
/// <returns></returns>
public int Add(int p1, int p2)
{
return p1 + p2;
}
}
}
2、制定相关处理函数:
/// <summary>
/// 获取属性
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
this.richTextBox1.Text = "";
Assembly assembly = Assembly.Load("WinFormQandA");
Type type = assembly.GetType("WinFormQandA.User");
PropertyInfo[] pro = type.GetProperties();
foreach (PropertyInfo p in pro)
{
this.richTextBox1.Text += p.Name;
this.richTextBox1.Text += "\n";
}
}
/// <summary>
/// 获取方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
this.richTextBox1.Text = "";
Assembly assembly = Assembly.Load("WinFormQandA");
Type type = assembly.GetType("WinFormQandA.User");
MethodInfo[] met = type.GetMethods();
foreach (MethodInfo m in met)
{
this.richTextBox1.Text += m.Name;
this.richTextBox1.Text += "\n";
}
}
/// <summary>
/// 调用方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
Assembly assembly = Assembly.Load("WinFormQandA");
Type type = assembly.GetType("WinFormQandA.User");
MethodInfo met = type.GetMethod("Add");
object obj = Activator.CreateInstance(type, null);
Object[] num = { 10, 23 };
this.richTextBox1.Text = met.Invoke(obj, num).ToString();
}
3、实现效果