1.什么是反射(Reflection)
System.Reflection 命名空間中的類與 System.Type 使你能夠獲取有關加載的程序集和其中定義的類型的信息,如類、接口和值類型。
2.反射能干什么
可以使用反射在【運行時】創建、調用和訪問類型實例。說白了就是通過反射能夠獲取一個未知類的類型。
3.通過代碼解讀反射
- System.Type獲取有關加載的程序集和其中定義的類型的信息
public class ReflectionTest {
/// <summary>
/// 反射名稱
/// </summary>
public string ReflectionName { get; set; }
public string GetName()
{
return "張三";
}
}
Type type = typeof(ReflectionTest);
string name = type.Name;//獲取當前成員的名稱
string fullName = type.FullName;//獲取類的全部名稱不包括程序集
string nameSpace = type.Namespace;//獲取該類的命名空間
var assembly = type.Assembly;//獲取該類的程序集名
var module = type.Module;//獲取該類型的模塊名
var memberInfos = type.GetMembers();//得到所有公共成員
- 反射構造帶參的例子(帶參)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace FanShe3
{
class Test
{
public Test(string Say)
{
Console.WriteLine(Say);
}
}
class Program
{
static void Main(string[] args)
{
Test t;
string Say = "哈哈!!創建成功";
//開始創建反射,這個是獲取當前程序集的意思,如果需要反射類庫可以使用Assembly.Load的方法
Assembly asm = Assembly.GetExecutingAssembly();
//需要注意的地方是,如果反射的構造函數帶參只是一個,這里創建的也必須是一個參數的Object數組,而且順序也必須和構造函數一樣
object[] Obj = new object[1];
Obj[0] = Say;
t = (Test)asm.CreateInstance("FanShe3.Test", true, BindingFlags.Default, null, Obj, null, null);
Console.ReadKey();
}
}
}
- 傳遞對象
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace FanShe4
{
class Test
{
public Test(Test2 t2)
{
t2.Say();
}
}
public class Test2
{
public void Say()
{
Console.WriteLine("哈哈!!創建成功");
}
}
class Program
{
static void Main(string[] args)
{
Test t;
Test2 t2 = new Test2();
//開始創建反射,這個是獲取當前程序集的意思,如果需要反射類庫可以使用Assembly.Load的方法
Assembly asm = Assembly.GetExecutingAssembly();
//需要注意的地方是,如果反射的構造函數帶參只是一個,這里創建的也必須是一個參數的Object數組,而且順序也必須和構造函數一樣
object[] Obj = new object[1];
Obj[0] = t2;
t = (Test)asm.CreateInstance("FanShe4.Test", true, BindingFlags.Default, null, Obj, null, null);
Console.ReadKey();
}
}
}
