什么时候来自不同MethodInfos的两个RuntimeMethodHandles比较相同?

时间:2014-10-22 10:33:44

标签: .net reflection

当我有两个不同的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>.fFoo<string>.f具有相同的方法句柄(在代码中需要检查MethodInfo是否为{{} 1}}对于某些Foo<T>.f,其中T已知为引用类型),我想知道是否需要重写该代码。

1 个答案:

答案 0 :(得分:2)

我没有看到RuntimeMethodHandle语义的明确定义。但是,您应该能够使用MethodInfo.MetadataToken,前提是MethodInfoFoo<object>.f位于同一模块中(不同的模块可以共享元数据标记值,但相同的元数据标记只有一个在特定模块中的含义)。如果MethodInfo来自任意位置,请首先检查Module属性是否相等,然后检查MetadataToken属性。