当我有两个不同的MethodInfo
个对象时,他们的MethodHandle
值仍然可以比较相等。当获得相同泛型类型的两个不同实例的非泛型方法的方法句柄时,可能会发生这种情况,但并非总是如此。在实验上,我可以确定静态方法不是这种情况,也不确定其中一个实例化是否具有值类型。
using System;
static class Program
{
static void Main()
{
Console.WriteLine("Foo<object>.f == Foo<string>.f: " +
(typeof(Foo<object>).GetMethod("f").MethodHandle ==
typeof(Foo<string>).GetMethod("f").MethodHandle));
Console.WriteLine("Foo<object>.f == Foo<int>.f: " +
(typeof(Foo<object>).GetMethod("f").MethodHandle ==
typeof(Foo<int>).GetMethod("f").MethodHandle));
Console.WriteLine("Foo<object>.g == Foo<string>.g: " +
(typeof(Foo<object>).GetMethod("g").MethodHandle ==
typeof(Foo<string>).GetMethod("g").MethodHandle));
Console.WriteLine("Foo<object>.g == Foo<int>.g: " +
(typeof(Foo<object>).GetMethod("g").MethodHandle ==
typeof(Foo<int>).GetMethod("g").MethodHandle));
Console.ReadKey();
}
}
class Foo<T>
{
public void f() { }
public static void g() { }
}
输出:
Foo<object>.f == Foo<string>.f: True Foo<object>.f == Foo<int>.f: False Foo<object>.g == Foo<string>.g: False Foo<object>.g == Foo<int>.g: False
但是,我无法找到任何关于此的官方文档。对我得到的结果有什么保证吗?我可以安全地假设这些结果中的哪一个在.NET Framework的未来更新中不会改变,哪些可能会改变?
我特意询问是因为我的代码依赖于Foo<object>.f
和Foo<string>.f
具有相同的方法句柄(在代码中需要检查MethodInfo
是否为{{} 1}}对于某些Foo<T>.f
,其中T
已知为引用类型),我想知道是否需要重写该代码。
答案 0 :(得分:2)
我没有看到RuntimeMethodHandle
语义的明确定义。但是,您应该能够使用MethodInfo.MetadataToken
,前提是MethodInfo
与Foo<object>.f
位于同一模块中(不同的模块可以共享元数据标记值,但相同的元数据标记只有一个在特定模块中的含义)。如果MethodInfo
来自任意位置,请首先检查Module
属性是否相等,然后检查MetadataToken
属性。