ILRuntime使用(c#及ILRuntime反射)

4 篇文章 0 订阅

1.c#反射

1.介绍 

反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。

2.通过反射获取类型

//1.通过typeof获取某个值的类型
System.Type stuType=typeof(Student);

//2.通过一个对象获取该对象所对应的类的类型
Student stu=new Student();
System.Type type=stu.GetType();

//3.通过类的名称字符串获取对应的类型
System.Type strType =System.Type.GetType("Student");

3.类型常用类型(获取方法)(常用方法)

 1.Assembly:定义和加载程序集,加载程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例(type.Assembly)

2.Module:了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法(type.Module)

3.ConstructorInfo:了解构造器的名称、参数、访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等(type.GetConstructor/GetConstructors)

4.MethodInfo:了解方法的名称、返回类型、参数、访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等(type.GetMethod/GetMethods)(invoke调用方法)

5.FieldInfo:了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值(type.GetField/GetFields)(SetValue(对象,值)GetValue(对象)静态字段对象设置为null)

6.EventInfo:了解事件的名称、事件处理程序数据类型、自定义特性、声明类型和反射类型等,并添加或移除事件处理程序(type.GetEvent/GetEvents)

7.PropertyInfo:了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,并获取或设置属性值(type.GetProperty/GetProperties)

8.ParameterInfo:了解参数的名称、数据类型、参数是输入参数还是输出参数等,以及参数在方法签名中的位置等(type.GetMethod.GetParameters)

9.MemberInfo:了解成员的名称、返回类型、参数、访问修饰符(如public或private)和实现详细信息等(type.GetMember/GetMembers)(MemberType获取成员类型)

4.BindingFlags

按照权限来获取类型的枚举。下列常用4种类型

1.BindingFlag.Public    公有成员

2.BindingFlags.Instance    实例成员

3.BindingFlag.NonPublic   非公有成员

4.BindingFlags.Static   静态成员

5.Activator

通过反射几种不同的构造来实例化对象。

1.Activator.CreateInstance(Type t) //默认公有无参构造

2.Activator.CreateInstance(Type t ,bool nonPublic)//默认私有无参构造

3.Activator.CreateInstance(Type t,params object[] args)//默认公有有参构造

2.ILRuntime反射

C#工程中反射是一个非常经常用到功能,ILRuntime也对反射进行了支持,在热更DLL中使用反射跟原生C#没有任何区别。接下来主要介绍如何在主工程中反射热更DLL中的类型。

        //热更DLL中的类型我们均需要通过AppDomain取得
        IType it = appdomain.LoadedTypes["HotFix_Project.InstanceClass"];
        //LoadedTypes返回的是IType类型,但是我们需要获得对应的System.Type才能继续使用反射接口
        System.Type type = it.ReflectionType;

        //取得Type之后就可以按照我们熟悉的方式来反射调用了
        var ctor = type.GetConstructor(new System.Type[0]);
        var obj = ctor.Invoke(null);        
        var fi = type.GetField("id", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        fi.SetValue(obj, 111111);
        var pi = type.GetProperty("ID");
        Debug.Log("ID = " + pi.GetValue(obj, null));

ILRuntime免费课程

两小时带你搞懂ILRuntime热更新Unity ILRuntime 热更新icon-default.png?t=LA92https://www.bycwedu.com/promotion_channels/1021737097 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萧寒大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值