.net - 为什么没有 .NET RuntimePropertyHandle 和 PropertyInfo.GetPropertyFromHandle?

标签 .net cil

我已经看到了以下 .NET 类型和 TypeFieldInfoMethodInfo 的函数:

RuntimeTypeHandle th = ...;
Type t = Type.GetTypeFromHandle(th);

RuntimeFieldHandle fh = ...;
FieldInfo f = FieldInfo.GetFieldFromHandle(fh);

RuntimeMethodHandle mh = ...;
MethodInfo m = MethodBase.GetMethodFromHandle(mh);

但是,似乎没有对应的句柄类型和属性的 Get...FromHandle。有没有我没看到的,或者有什么充分的理由说明这些不存在?

当我已经可以访问我感兴趣的属性的属性 token 时,必须使用 Type.GetProperty 查找 PropertyInfo 似乎效率很低。

最佳答案

作为coreclr显示、属性和事件没有句柄,因此它们没有 Runtime...HandleGet...FromHandle。考虑“句柄”在他们的上下文中是完全无效的。

至于为什么,我猜原因是属性和事件是纯粹的元数据的东西,而方法和字段要多得多。有用于访问方法、字段和类型的 CIL 操作码,但没有用于属性或事件的操作码。使用它们被编译为 CIL,就像使用它们各自的访问器方法之一一样。它们实际上只不过是运行时的元数据片段,因此不需要句柄。

我自己问了一个similar question ,并且对于属性和事件的解析方法数量确实有限。至于您的基本问题,我想枚举所有属性并查找 MetadataToken 可能比使用 GetProperty 更有效,但我宁愿测试一下。

关于.net - 为什么没有 .NET RuntimePropertyHandle 和 PropertyInfo.GetPropertyFromHandle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41388543/

相关文章:

c# - Windows 窗体线程到底发生了什么?

c# - 如何在 Windows 上使用 .Net 构建 iphone 应用程序?

c# - 在WPF中创建动态生成的单选按钮时,程序崩溃

c# - 调整矩形角

.net - MSIL 虚拟地址

c# - .net 反汇编器/反编译器

java - MSIL 和 Java 字节码的区别?

c# - Linq-to-SQL WHERE IN 语句返回的内容超出预期

.NET 4.5 MethodBuilder.SetMethodBody

c# - 在哪里可以找到MSIL字符串常量中的转义字符列表?