//反射是.NET中的重要機制,通過反射,可以在運行時獲得.NET中每一個類型
//(包括類、結構、委託、接口和枚舉等)的成員,包括方法、屬性、事件,以及構造函數等。
//有了反射,即可對每一個類型瞭如指掌,如果獲得了構造函數的信息,即可直接創建對象
class Program
{
//反射可以看到類的屬性和方法,設置和獲取屬性值,調用方法
// { GetProperties 獲取屬性
//Type
// { GetMethods 獲取方法
//
// { GetValue(實例)
//屬性 ProPertyInfo
// { SetValue(實例,值)
//
//方法 MethodInfo invoke(實例,參數)
//
static void Main(string[] args)
{
Stu s = new Stu() { Name = "佔山" };
Stu s2 = new Stu() { Name = "王五" };
Type t = s.GetType();
//獲取所有屬性名稱
var ps = t.GetProperties();
//獲取所有方法名稱
var ms = t.GetMethods();
//顯示屬性
foreach (var i in ps)
{
Console.WriteLine(i.Name);
}
Console.WriteLine("-----------------------");
Console.WriteLine("-----------------------");
//顯示方法 前面兩個是隻讀和只寫的兩個方法,第三個是咱們定義的方法,後面四個是繼承自Object的方法
foreach (var j in ms)
{
Console.WriteLine(j.Name);
}
Console.WriteLine("-----------------------");
Console.WriteLine("-----------------------");
//給第一個學生賦值
ps[0].SetValue(s, "里斯");
//讀取值
Console.WriteLine(s.Name);
//獲取第二學生的姓名
Console.WriteLine(ps[0].GetValue(s2));
Console.WriteLine("-----------------------");
Console.WriteLine("-----------------------");
//調用方法,第一個值是學生信息,第二個是方法參數,沒有參數就傳null
ms[2].Invoke(s, new object[] { "Hello","World"});
Console.Read();
}
//學生類
class Stu
{
public string Name { get; set; }
public void Say(string a1, string a2)
{
Console.WriteLine(a1+" "+a2);
}
}
//動態加載dll文件
static void Main(string[] args)
{
// 路徑E盤下的dll文件
Assembly a = Assembly.LoadFile(@"e:\ClassLibrary1.dll");
//獲取所有類型
//Type[] atypess = a.GetTypes();
//foreach (Type t1 in atypess)
//{
// Console.WriteLine(t1);
//}
//類型全名
var s = a.CreateInstance("ClassLibrary1.Stu");
//類型全名
Type t = a.GetType("ClassLibrary1.Stu");
//要獲取的屬性名
var name = t.GetProperty("Name");
var age = t.GetProperty("Age");
//賦值
name.SetValue(s, "張三");
age.SetValue(s, 19);
//獲取方法
MethodInfo m = t.GetMethod("Say");
//調用方法,傳入對應參數
m.Invoke(s,new object[] { "晚上"});
Console.ReadKey();
}
}
C#反射是什麼?概念+代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.