C#进阶语法 --反射

164 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

前言

今天是我更新.net的第二天,我相信大家都有一定的编程基础。像C#基础语法我就不进行详述了,我们多讲一讲C#的高阶语法,今天没玩讲的是反射。对于反射的理解呢,我觉得就是执行dll文件就行,步骤大致为加载dll文件,然后获取想要的类,再进行实例化获取其他的操作,下面我们一起来看一看吧。

反射

这下面我的解释都在注释中,方便理解。

1,调用构造方法

1.加载DLL文件

Assembly assembly =Assembly.LoadForm(@"SqlServerDB.dll");

2.获取指定类型

Type type = assembly.GetType("SqlServer.ReflectionTest");

3.实例化

ReflectionTest reftest = new ReflectionTest()//这种实例化为静态的实例化object objtest = Activetor.CreateInstance(type);//动态实例化 -- 调用我们的无参构造函数object objtest = Activetor.CreateInstance(typenew object[]{"Ant编程"});动态实例化 -- 调用我们的有参构造函数
​

2.调用所有类的构造方法

1.加载DLL文件

Assembly assembly =Assembly.LoadForm(@"SqlServerDB.dll");

2.获取类型

foreach(var item in assembly.GetTypes()){
    Console.WriteLine(item,name)
}
Type type = assembly.GetType("SqlServer.ReflectionTest"); 
//获取指定类型
foreach(var ctor in type.GetConstrustors(Binding.Instance |Binding.Nopublic )){ //获取构造函数
    foreach(var param in ctor.GetParameter()){
        Console.WriteLine(param.ParameterType)
    }
}

3.调用普通方法/私有方法

Assembly assembly =Assembly.LoadForm(@"SqlServerDB.dll");
​
Type type = assembly.GetType("SqlServer.ReflectionTest");
​
object objtest = Activetor.CreateInstance(type);//动态实例化 -- 调用我们的无参构造函数
​
ReflectionTest reftest = objtest as ReflectionTest; //as转换不报错,类型不对,返回null
​
reftest.show(); //调用普通方法
var method  = type.GetMethod("show2",Binding.Instance |Binding.Nopublic );
​
method.Invoke(objtest,new object[]{})
//调用私有方法

4.调用泛型方法

//无参数
Assembly assembly =Assembly.LoadForm(@"SqlServerDB.dll");
​
Type type = assembly.GetType("SqlServer.ReflectionTest");
​
object objtest = Activetor.CreateInstance(type);//动态实例化 -- 调用我们的无参构造函数
​
var method1 = type.GetMethod("show1");
var generiiCMethod = method1.MakeGenericMethod(new Type[]{typeof(int)});//指定泛型类型
​
generiiCMethod.Invoke(objtest,new object[]{ })
​
//有参数
var method2 = type.GetMethod("show2");
var generiiCMethod2 = method2.MakeGenericMethod(new Type[]{typeof(string)});//指定泛型类型
​
generiiCMethod.Invoke(objtest,new object[]{123,"ww" });

5.调用泛型类和泛型方法

//加载DDL文件
Assembly assembly =Assembly.LoadForm(@"SqlServerDB.dll");
//获取指定类型
Type type = assembly.GetType("SqlServer.GenericClass`2").MakeGenericType(type(int),typeof(string));
//创建实例
object objtest = Activetor.CreateInstance(type);
var method = type.GetMethod("Genericmethod).MakeGenericMthod(typeof(int))
​
method.Invoke(objtest,new object[]{})

6.获取属性值和设置属性值

Assembly assembly =Assembly.LoadForm(@"SqlServerDB.dll");
​
Type type = assembly.GetType("SqlServer.PropertyClass");
​
object objtest = Activetor.CreateInstance(type);//动态实例化 -- 调用我们的无参构造函数
​
foreach(var property in type.GetPropertities()){
    Console.WriteLine(property.Name);
      //给属性设置值
    if(property.Name Equals("Name")){
        property.SetValue(objtest,"李四")
    }else if(property.Name Equals("Phone")){
         property.SetValue(objtest,"12345")
    }
    
    //获取属性值
    Console.WriteLine(property.GetValue(objtest))
        
}

总结:反射其实是很重要的,在后面项目开发时候使用的框架都是要使用到的,所以大家还是要好好沉下心来好好学一学,这样对你的代码理解和代码水平也有提升。一步步来,加油!