.Net 反射學習

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();//調用方法
 
 
建立不一樣的對象:
一、無參對象:
object obj = Activator.CreateInstance(type,null);
二、有參對象 int參數爲例:
object obj = Activator.CreateInstance(type,new object[]{11});
三、建立泛型對象
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); }
相關文章
相關標籤/搜索