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

时间:2016-12-29 23:18:08

标签: .net cil

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

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

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

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

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

当我已经有权访问我感兴趣的属性的属性令牌时,使用PropertyInfo查找Type.GetProperty似乎非常低效。

1 个答案:

答案 0 :(得分:1)

coreclr所示,属性和事件没有句柄,因此没有Runtime...HandleGet...FromHandle。对“句柄”的思考在其背景下无效。

至于为什么,我想原因是属性和事件纯粹是元数据事物,而方法和字段则更多。有用于访问方法,字段和类型的CIL操作码,但没有用于属性或事件的操作。使用它们将使用它们各自的访问器方法编译为CIL。它们实际上只不过是运行时的元数据,因此它们不需要句柄。

我自己问了一个similar question,而且属性和事件的解析方法数量非常有限。至于你的基本问题,我想我会枚举所有属性,寻找MetadataToken可能比使用GetProperty更有效,但我宁愿测试它。