通过对一个类的操作,分别展示C#反射各个方法的使用。
// 通过程序集名称返回Assembly对象
// 通过Assembly获取程序集中类,参数必须是类的全名
// GetMethod获取类方法
// GetProperty获取有get和set封装的字段
// GetField获取公有字段
// GetField获取私有字段
// Activator.CreateInstance创建类实例
using System;
using System.Reflection;
namespace CSharpTest01
{
class Contact
{
// Read-only properties.
public string Name { get; private set; }
public string Address { get; private set; }
public string m_sMail;
int id;
// Public constructor.
public Contact()
{
}
public Contact(string contactName, string contactAddress, string mail, int ID)
{
Name = contactName;
Address = contactAddress;
m_sMail = mail;
id = ID;
}
public void Print()
{
Console.WriteLine("Name:" + Name + " Address:" + Address + "m_sMail" + m_sMail + "id" + id);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("1.通过程序集的名称反射");
// 通过程序集名称返回Assembly对象
Assembly ass = Assembly.Load("CSharpTest01");
// 通过Assembly获取程序集中类,参数必须是类的全名
Type t = ass.GetType("CSharpTest01.Contact");
// 创建一个类
Contact contact = new Contact("kerven", "123", "123@qq.com", 2001);
// GetMethod获取类方法
MethodInfo mi = t.GetMethod("Print");
mi.Invoke(contact, null);
contact.Print();
// GetProperty获取有get和set封装的字段
object name = "newName";
t.GetProperty("Name").SetValue(contact, name);
mi.Invoke(contact, null);
contact.Print();
// GetField获取公有字段
object mail = "456@163.com";
t.GetField("m_sMail").SetValue(contact, mail);
mi.Invoke(contact, null);
contact.Print();
// GetField获取私有字段
int numID = 9999;
FieldInfo fi = t.GetField("id", BindingFlags.NonPublic | BindingFlags.Instance);
fi.SetValue(contact, numID);
mi.Invoke(contact, null);
contact.Print();
// Activator.CreateInstance创建类实例
object o = Activator.CreateInstance(t, "name", "stringStr", "123@qq.com", 1001);
MethodInfo print = t.GetMethod("Print");
print.Invoke(o, null);
t.InvokeMember("Print", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,
null, contact, null);
Console.ReadKey();
}
}
}
另附一个不错的讲解反射的博客文章:
https://www.cnblogs.com/huangcong/archive/2010/05/15/1736127.html