一起养成写作习惯!这是我参与「掘金日新计划 · 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(type,new 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))
}