反射:就是操作dll文件的一个类库
最近想依赖注入一个泛型的类 不知怎么操作 再来重新复习下反射内容
假设我们有一个.dll文件叫xiaomi,完整路径为
C:\工程文件\xiaomi.dll
一、加载DLL文件
- 方式一 Assmbly.Load(“xiaomi”)
Assembly assembly = Assembly.Load("xiaomi");
//这个DLL文件要在启动项目下
- 方式二 Assembly.LoadFile(“完整路径”)
Assembly assembly = Assembly.LoadFile(@"C:\工程文件\xiaomi.dll");
- 方式三 Assembly.LoadFrom(“以上2种方式的参数都可以”) 还可以用全名xiaomi.dll
Assembly assembly = Assembly.LoadFrom("xiaomi.dll");
二、获取指定类型
此时xiaomi.dll里面有一个类叫ReflectionTest
Type type = assembly.GetType("xiaomi.ReflectionTest");
Type[] types = assembly.GetTypes();//获取当下所有类型
ConstructorInfo[] constructorInfos = types[0].GetConstructors();//获取当下所有构造方法
PropertyInfo[] propertyInfos = types[0].GetProperties();//获取类下所有属性
MethodInfo[] methodInfos = types[0].GetMethods();//获取当前类下所有方法
ParameterInfo[] parameterInfos = constructorInfos[0].GetParameters();//获取该构造方法的所有参数
三、实例化类型
object obj = Activator.CreateInstance(type);
//这种方法我们不知道具体类型 动态实例化
调用有参数的构造方法
new object[]{}可以放置多个参数
object obj = Activator.CreateInstance(type,new object[] { });
调用私有的构造方法 参数最后加个true就好了
object obj = Activator.CreateInstance(type,true);
四、转化类型
已知类型
ReflectionTest reflectionTest = obj as ReflectionTest;
reflectionTest.Show();//调用普通方法
未知类型
MethodInfo? methodInfo = type.GetMethod("show", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);//默认是publilc 这里我们把私有的也找到
object? v = methodInfo.Invoke(obj, new object[] { });
五、调用泛型方法
我们有一个泛型方法叫show()
MethodInfo methodInfo1 = methodInfo.MakeGenericMethod(new Type[] { typeof(int) });
六、调用泛型类型
我们现在有一个泛型类型 GenericClass<T,W>
Type type = assembly.GetType("xiaomi.GenericClass`2").MakeGenericType(typeof(int),typeof(string));