MethodInfo 可以安全地用于字典键吗?

时间:2021-03-22 12:56:34

标签: c# .net reflection

我正在尝试使用 MethodInfo 实例作为字典键,但我无法验证 .net 运行时是否很好地支持它。

更准确地说,给定两个 RuntimeMethodInfo 实例 m1m2,它们是从 .net 反射 API 获得的,并且表示相同的方法。 .net 运行时是否总是保证 m1.GetHashCode() == m2.GetHashCode()m1.Equals(m2)

我可以在 stackoverflow 上找到同样的问题: Can MethodInfo be used as Dictionary key?

答案声称,是的,MethodInfo 可用于字典键。但是我无法验证此声明。

看一下 the source code of RuntimeMethodInfo,似乎 GetHashCode() 的实现只是调用了 RuntimeHelpers.GetHashCode() 的默认实现(当该方法不是泛型时)。

如果我的理解是正确的RuntimeHelpers.GetHashCode(),只有在对象引用相同时才保证返回相同的哈希码。

如果我的假设是正确的,这意味着 MethodInfo 不能安全地用作字典键,除非反射 API 始终保证为相同的给定方法返回相同的 MethodInfo 实例。是否有任何官方文件可以确认此保证?

1 个答案:

答案 0 :(得分:1)

我相信这里最好的选择是检查 C# 标准和文档。至于文档 - 没有关于 GetMethod 返回值的任何保证。因此,相同的调用是否会返回相同或不同的 MethodInfo 实例是特定于实现的。 MethodInfo.Equals 会考虑不同的实例,描述相同的方法是否真的相等?文档中也没有明确的保证,所以我更愿意考虑这也是特定于实现的。

恢复:对于 POC/MVP,您可以使用 MethodInfo 作为键,因为当前实现完成了将其用作键所需的所有工作。但在任何长期/跨平台/等项目的情况下,我建议不要使用 MethodInfo 作为键,因为行为可能会在未来发生变化或者今天可能已经不同,但对于其他运行时。