.Net 反射學習

H哥努力啊發表於2019-02-12
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);
}

相關文章