Dan*_*ant 5 .net c# reflection il reflection.emit
我有一个应用程序,其中有一个采用 PropertyInfo 参数的方法,并且希望从 IL 调用此方法。例如,对于采用 MethodInfo 的类似方法,我可以创建一个采用RuntimeMethodHandle 的中间方法并使用GetMethodFromHandle。然后 IL 可以使用Ldtoken来传递句柄。
但是,似乎没有等效的属性元数据标记。我可以理解为什么会出现这种情况(因为属性实际上只是将方法捆绑在一起的一种方式,并且永远不会从 IL 中“调用”),但肯定存在与该类型关联的属性元数据。我可以在发出时访问此属性元数据,因此我想要一种能够直接传递此属性的方法,而不必在运行时通过名称诉诸反射(即,向 GetProperty 发出反射调用,并采用将在以下位置执行的字符串)运行时。)有办法做到这一点吗?
根据评论中的请求,这是应用程序:
我正在创建一个适配器类,它通过属性公开属性引用作为其组件位bool this[int index]。我的应用程序将 PLC 代码编译为 .NET 程序集,因此我尝试创建诊断访问器,该访问器近似于 PLC 提供的简单按位访问(您在其中写入MyTag.2以指示 tag 的位 2 MyTag)。此语法不能用于C# 的消耗,但这PLC.GetBits().MyTag[2]是一个合理的近似值。
我最初的方法是使用 PropertyInfo 实现的(这就是我遇到此问题的方式),但我当然可以通过将 PropertyInfo 中的适用元数据作为多个参数传递来解决此问题。我主要只是好奇是否可以直接传递 PropertyInfo,因为我以前从未遇到过这种情况。
不,我认为你不能。我这样说,部分是因为对 API 的熟悉,部分是因为ExpressionC# 编译器中的编译器在引用 a 时仍然使用反射PropertyInfo,但ldtoken在引用类型和方法(例如, getter )时使用更直接的方法(等) /设置者)。我怀疑如果它存在的话 C# 编译器团队会使用它。
然而,在大多数常见的 IL 发出场景中,没有必要传递PropertyInfo. 选项:
MethodBase获取 getter 或 setter(方法可以通过令牌获取),并通过名称推断属性(不是 100% 稳健,但通常应该有效)| 归档时间: |
|
| 查看次数: |
956 次 |
| 最近记录: |