Why?為什麼使用反射 MVC ORM EF 都是用的反射。反射可以讓程式的擴展性,靈活性得到加強。一起即可動態創建 what 反射原理 動態載入類庫 ,先添加引用類庫,或者複製debug裡面的文件dll到運行文件Debug Assembly assembly = Assembly.Load("We ...
Why?為什麼使用反射 MVC ORM EF 都是用的反射。反射可以讓程式的擴展性,靈活性得到加強。一起即可動態創建 what 反射原理 動態載入類庫 ,先添加引用類庫,或者複製debug裡面的文件dll到運行文件Debug Assembly assembly = Assembly.Load("WeiAi.DB.MysqlHelper");//反射生成類庫 使用Assembly ,Load方法 裡面填寫namespace
foreach (var item in assembly.GetModules()) //遍歷類庫的dll文件
{
Console.WriteLine(item.Name);
}
foreach (var item in assembly.GetTypes())//遍歷類庫的類型
{
Console.WriteLine(item.Name);
foreach (var act in item.GetMethods())//遍歷類的方法
{
Console.WriteLine(act.Name);
} }
反射創建對象並調用方法 Assembly assembly = Assembly.Load("WeiAi.DB.MysqlHelper"); //反射類庫 Type type = assembly .GetType("WeiAi.DB.MysqlHelper.MySQLHelper");//反射類型 object obj = Activator.CreateInstance(type,null);//動態創建類的對象 ISQLHelper mysql = oMysql as ISQLHelper;// ISQLHelper 是創建的一個介面,MysqlHelper實現了這個介面,所以它類的對象可以轉換 mysql.Query();//調用方法 創建不同的對象: 1、無參對象: object obj = Activator.CreateInstance(type,null); 2、有參對象 int參數為例: object obj = Activator.CreateInstance(type,new object[]{11}); 3、創建泛型對象 Type genericType = assembly.CreateInstance("WeiAi.DB.MysqlHelper.GenericClass`3");//GenericClass為泛型類 有3個泛型,就寫數字3 Type ty1 =genericType.MakeGenericType(new Type[]{typeof{int},typeof{string},typeof{int}}); object obj =Activator.CreateInstance(ty1,new object[]{11,"hello",123});//三個有參構造函數 object obj =Activator.CreateInstance(ty1,null);//無參構造函數 調用不同的方法: {
object ob1 = Activator.CreateInstance(myType);
MethodInfo method = myType.GetMethod("Show1");//無參方法
method.Invoke(ob1, null);
}
{
object ob1 = Activator.CreateInstance(myType);
MethodInfo method = myType.GetMethod("Show2", new Type[] { typeof(int) });//有一個參方法
method.Invoke(ob1, new object[] { 12 });
}
{
object ob1 = Activator.CreateInstance(myType);
MethodInfo method = myType.GetMethod("Show3", new Type[] { typeof(int), typeof(string) });//有兩個參方法
method.Invoke(ob1, new object[] { 12, "haha" });
}
{
//Type myType1 = assembly.GetType("WeiAi.DB.MysqlHelper.GenericMethod");
//object ob1 = Activator.CreateInstance(myType1);
//MethodInfo method = myType1.GetMethod("Show");
//MethodInfo methodNew= method.MakeGenericMethod(new Type[] { typeof(int),typeof(string),typeof(double) });
//methodNew.Invoke(ob1,new object[] { 12,"Jianghao",123456});
object ob1 = Activator.CreateInstance(myType);
MethodInfo method = myType.GetMethod("Show4");
MethodInfo methodNew = method.MakeGenericMethod(new Type[] { typeof(int) });//泛型方法
methodNew.Invoke(ob1, new object[] { 123123123 });
}
{
object ob1 = Activator.CreateInstance(myType);
MethodInfo method = myType.GetMethod("Show5");//靜態方法
method.Invoke(null, null);
}
{
object ob1 = Activator.CreateInstance(myType);
MethodInfo method = myType.GetMethod("Show6");//帶返回值的方法
object result = method.Invoke(ob1, null);
Console.WriteLine(result);
} 反射類的屬性和欄位,並且動態賦值或者獲取值 Type type = typeof(Person);
Person oPerson = (Person)Activator.CreateInstance(type);
oPerson.Id = 123;
oPerson.Name = "hai";
oPerson.Age = 18;
oPerson.Description = "1111111111111111";
// Person person = new Person();
foreach (var item in type.GetProperties())//屬性
{
Console.WriteLine(item.Name);
Console.WriteLine(item.GetValue(oPerson));
if (item.Name.Equals("Id"))
{
item.SetValue(oPerson, 12);
}
if (item.Name.Equals("Name"))
{
item.SetValue(oPerson, "jianghao");
}
if (item.Name.Equals("Age"))
{
item.SetValue(oPerson, 22);
}
if (item.Name.Equals("Description"))
{
item.SetValue(oPerson, "hahahahaha");
}
Console.WriteLine(item.GetValue(oPerson));
}
foreach (var item in type.GetFields())//欄位
{
Console.WriteLine(item.Name);
}