gpt4 book ai didi

c# - 通过元数据 token 访问 PropertyInfo 以便从 IL 使用?

转载 作者:太空狗 更新时间:2023-10-30 00:42:51 24 4
gpt4 key购买 nike

我有一个应用程序,其中有一个采用 PropertyInfo 参数的方法,我想从 IL 调用这个方法。例如,对于采用 MethodInfo 的类似方法,我可以创建采用 RuntimeMethodHandle 的中间方法并使用 GetMethodFromHandle .然后 IL 可以使用 Ldtoken传递句柄。

但是,似乎没有属性的等效元数据标记。我明白为什么会这样(因为属性实际上只是一种将方法捆绑在一起的方式,从不从 IL 中“调用”),但是肯定有与类型关联的属性元数据。我可以在发射时访问这个属性元数据,所以我想要一种能够直接传递它而不必在运行时按名称求助于反射的方法(即发出对 GetProperty 的反射调用,获取一个将在运行时。)有办法做到这一点吗?


根据评论中的要求,这里是应用程序:

我正在创建一个适配器类,它通过 bool this[int index] 属性将属性引用公开为其组件位。我的应用程序将 PLC 代码编译为 .NET 程序集,因此我正在尝试创建诊断访问器,它近似于 PLC 提供的简单按位访问(您在其中编写 MyTag.2 以指示标记的第 2 位MyTag。)此语法不能用于 C# 使用,但 PLC.GetBits().MyTag[2] 是一个合理的近似值。

我最初的方法是使用 PropertyInfo 实现的(这就是我遇到此问题的方式),但我当然可以通过将 PropertyInfo 中的适用元数据作为多个参数传递来解决它。我主要是想看看是否可以直接传递 PropertyInfo,因为我以前从未遇到过这种情况。

最佳答案

不,我不认为你可以。我之所以这么说,部分是因为熟悉该 API,部分是因为 C# 编译器中的 Expression 编译器在引用 PropertyInfo 时仍然使用反射,但使用更直接方法(ldtoken 等)指的是类型和方法(例如,getter/setter)。我怀疑 C# 编译器团队会使用它(如果它存在的话)。

但是,在大多数常见的 IL 发射场景中,没有必要传递 PropertyInfo。选项:

  • 使用 MethodBase 获取 getter 或 setter(方法可以通过 token 获取),并通过名称推断属性(不是 100% 稳健,但通常应该有效)
  • 改为传递名称 (ldstr)

关于c# - 通过元数据 token 访问 PropertyInfo 以便从 IL 使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13441742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com