【Unity|C#】基础篇(12)——反射(Reflection)(核心类:Type、Assembly) - 夏天的风92 - 博客园 (cnblogs.com)
using System;
using System.Reflection;
namespace 反射
{
/// <summary>
///
/// 反射基本信息:
/// exe/dll 主要区别就是EXE文件有入口,---metadata 元数据(描述exe/dll 文件的 一个数据清单)--反射 (Reflection)用来操作元数
/// 【1】更新程序时(更新自己的DLL)
/// 【2】使用别人的DLL 文件(这种可以读取别人私有的东西)
///
/// 反射是什么?他就是一个操作metadata的一个类库(可以把反射当做一个工具用来读取或者操作元数据时)
/// 类,方法,属性字段,特性(为什么使用反射间接去操作 1--因为我们需要动态 2--读取私有对象)
///
/// 几乎所有的框架都会用到反射
///
/// 可以把反射理解为反射工具 操作元数据的工具
///
/// 通过反射加载dll
///
/// 使用反射创建对象
/// </summary>
class Program
{
static void Main(string[] args)
{
//Assembly assembly = Assembly.LoadFile(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll");//加载方法一 通过路径
//Assembly assembly = Assembly.LoadFile("泛型"); //文件名
//Assembly assembly = Assembly.LoadFrom("泛型"); //文件名
#region 通过反射加载dll
Assembly assembly = Assembly.LoadFrom(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll"); //文件路径
foreach (var type in assembly.GetTypes())//查找所有类型(class)
{
Console.WriteLine(type.Name);
foreach (var method in type.GetMethods())//类型写下面的方法
{
Console.WriteLine("这是方法:" + method);
}
}
#endregion
#region 通过反射创建对象 调用dll私有(带参数)方法 获取(私有)属性 修改属性值 获取属性值
Assembly assembly = Assembly.LoadFrom(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll");//加载
Type type = assembly.GetType("泛型.Student2");//获取类型 必须通过命名空间.类型(类)
object student = Activator.CreateInstance(type);//创建对象 相当于 Student student= new Student();
//var m= type.GetMethod("Info").Invoke(student,null); //使用对象调用公开方法
//var m= type.GetMethod("Info").Invoke(student,new Object[]{11}); //使用对象调用带参数方法
//其他的还有 获取属性
var m = type.GetMethod("Info", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(student, null);//使用对象调用私有方法
PropertyInfo name = type.GetProperty("Name", BindingFlags.Instance | BindingFlags.NonPublic);
//设置属性值
name.SetValue(student, "大姑娘", null);
//获取属性值
name.GetValue(student, null);
#endregion
#region 使用反射创建对象(带参数的构造函数)
Assembly assembly = Assembly.LoadFrom(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll");//加载
Type type = assembly.GetType("泛型.Student2");//获取类型 必须通过命名空间.类型(类)
object student = Activator.CreateInstance(type, new object[] { "aa" });//创建带参数的对象
var m = type.GetMethod("Info", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(student, null);//使用对象调用私有方法
#endregion
#region 使用反射创建对象(私有构造函数)
Assembly assembly = Assembly.LoadFrom(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll");//加载
Type type = assembly.GetType("泛型.Student2");//获取类型 必须通过命名空间.类型(类)
object student = Activator.CreateInstance(type, true);//创建私有构造函数的对象
var m = type.GetMethod("Info", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(student, null);//使用对象调用私有方法
#endregion
#region 使用反射创泛型类
Assembly assembly = Assembly.LoadFrom(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll");//加载DLL文件
Type type = assembly.GetType("泛型.TClass`3");//获取类型 必须通过命名空间.类型(类) 这个 `是泛型的占位符 在键盘的数字左边波浪线按键
Type makeType = type.MakeGenericType(new Type[] { typeof(string), typeof(int), typeof(int) });//为泛型方法和泛型类指定具体类型
object student = Activator.CreateInstance(makeType);
#endregion
#region 通过反射调用泛型方法
Assembly assembly = Assembly.LoadFrom(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll");//加载DLL文件
Type type = assembly.GetType("泛型.TClasss");//获取类型 必须通过命名空间.类型(类) 这个 `是泛型的占位符 在键盘的数字左边波浪线按键
object ins = Activator.CreateInstance(type);
MethodInfo mi = type.GetMethod("TClass");
mi.MakeGenericMethod(new Type[] { typeof(int), typeof(string) }).Invoke(ins, new object[] { 2, "aa" });
#endregion
#region 通过反射调用泛型类型的泛型方法
Assembly assembly = Assembly.LoadFrom(@"D:\C#\反射\泛型\bin\Debug\netcoreapp3.1\泛型.dll");//加载DLL文件
Type type = assembly.GetType("泛型.TClassss`1");//获取类型 必须通过命名空间.类型(类) 这个 `是泛型的占位符 在键盘的数字左边波浪线按键
Type newType= type.MakeGenericType(new Type[] { typeof(int) });
object ins = Activator.CreateInstance(newType);
MethodInfo mi = type.GetMethod("TClass");
MethodInfo info=mi.MakeGenericMethod(new Type[] { typeof(int), typeof(string) });
info. Invoke(ins, new object[] { 2, "aa" });
#endregion
}
}
}
dll