.NET WinForm编程Q&A系列——反射机制

  背景    如何更好的认识反射机制,并如何更好的应用反射机制?
    概念
    1、反射就是动态发现类型信息的能力。
    它帮助程序设计人员在程序运行时利用一些信息去动态地使用类型,这些信息在设计时是未知的,这种能力类型于后期绑定。反射还支持的更高级的行为,能在运行时动态创建新类型,并且对这些新类型的操作进行调用。
    2、可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现 有对象中获取类型。
    3、应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。
    需求
    1、以某个实例为原型,重新生成一个新的实例,并对某些值做调整
    2、获取制定类的属性、方法,并调用其方法
    实例
    1、定义User类,属性大致包括:UserID、UserName、Age、Address、Remark等
    [csharp]
    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、制定相关处理函数:
    [csharp]
    /// <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>