我正在尝试使用 MethodInfo
实例作为字典键,但我无法验证 .net 运行时是否很好地支持它。
更准确地说,给定两个 RuntimeMethodInfo
实例 m1
和 m2
,它们是从 .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
实例。是否有任何官方文件可以确认此保证?
答案 0 :(得分:1)
我相信这里最好的选择是检查 C# 标准和文档。至于文档 - 没有关于 GetMethod 返回值的任何保证。因此,相同的调用是否会返回相同或不同的 MethodInfo 实例是特定于实现的。 MethodInfo.Equals 会考虑不同的实例,描述相同的方法是否真的相等?文档中也没有明确的保证,所以我更愿意考虑这也是特定于实现的。
恢复:对于 POC/MVP,您可以使用 MethodInfo 作为键,因为当前实现完成了将其用作键所需的所有工作。但在任何长期/跨平台/等项目的情况下,我建议不要使用 MethodInfo 作为键,因为行为可能会在未来发生变化或者今天可能已经不同,但对于其他运行时。