【Grasshopper进阶】反射?什么反射?用反射屏蔽掉C#Script电池的运行时长

写这次这一篇的原因是来自一个CSDN网友找到我提出了一个拷问:

知名网友:“我想把下面的代码放到 C# Script电池里,怎么加?”

public override TimeSpan ProcessorTime {
  get {
    if (setUp)
      return TimeSpan.Zero;
    else
      return base.ProcessorTime;
  }
}

知名网友:“我的目的是想让这个脚本电池不显示运行时间,不知道怎么处理了。”

我品了品,emmm,想要让C# Script电池不显示运行时间,大致是把这个去掉的意思吧:
Snipaste_2022-01-14_12-12-15
在自己编译电池里写这个还蛮简单的,就是网友给出的这段代码直接一个override就完事儿了,本质上是在Grasshopper询问ProcessorTime属性(也就是用来展示在电池下方的“处理用时”)时,在某种条件下直接返回TimeSpan.Zero来“谎称”自己零耗时。

但是要在C# Script电池里做这个事儿嘛… 本质上是需要在C# Script电池内通过Component这个属性值拿到电池本身,然后再设置这个ProcessorTime属性。但是,由于C# Script电池不是我们自己写的,我们似乎拿到了也没用,这玩意儿就是一个get属性,我们没法往里设置值啊,啊这……

不过,我们还是可以通过反编译来看看这个ProcessorTime是怎么个get到值的嘛,我们把它背后的值设置一下不就完了?打开Visual Studio,对着GH_Component直接进行一个F12的戳,戳就完事儿了。
Snipaste_2022-01-14_13-04-00
戳完直接Ctrl+F搜索关键词ProcessorTime,定睛一看:
Snipaste_2022-01-14_12-23-47
好家伙,是要去找_profiledSpan这个变量。再次Ctrl+F,喵喵喵?private
Snipaste_2022-01-14_12-25-48
众所周知,private的变量没法直接在类的外部获取/赋值,这可咋整?

此时,那就必须得祭出反射了。

反射可以在程序运行时获取所有对象的任何属性或字段,并更改。Peroid。

直接:

typeof(GH_Component).GetField("_profiledSpan",
                        BindingFlags.Instance | BindingFlags.NonPublic)
                    .SetValue(Component, TimeSpan.Zero);

把这段代码放到: (顶部有using System.Reflection;以及using System.Threading;
Snipaste_2022-01-14_12-44-35
诶嘿,虽然上面有个Thread.Sleep(500)的大老虎,但是这电池压根不显示运行时长。作为对比,再放个电池在它旁边,没有这段神秘代码的:
Snipaste_2022-01-14_12-47-08
至此就完成了这个简单的功能… (Grasshopper作者:“我做这功能是给你这么用的?”)

好了,上面的只是前菜。正餐先挖个坑,这里简单讲讲上面那段运用反射的逻辑:

  • typeof(GH_Component)用来获得“想要设置的属性/字段定义在哪个类里”
  • GetField(string name, BindingFlags flags)用来获得“这个类的具体的字段”
  • SetValue(object obj, object value)用来将具体的某个值设置到obj这个对象的刚刚获取到的“这个类的这个具体的字段”里去

上面的BindingFlags里用到了“位运算符” |。详情请见:位运算符和移位运算符(C# 参考)

这里输入了BindingFlags.Instance | BindingFlags.NonPublic是为了能够获取到标记为private的属性。

BindingFlags.NonPublic的名字我们也可以看出来,它是用来获取非public的内容,比如private或者protected

BindingFlags.Instance则是声明获取“成员”内容,而非“静态”内容,也就是没有被static标记的内容。

Cool,这期前菜就先到这,反射在Grasshopper里的应用下次再见。🦀

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值