具有不同签名但相互派生的方法

时间:2017-07-10 10:03:43

标签: c# method-signature derived-types

我有一个非常有趣的问题,但还没有找到任何答案。希望,有人可以帮助我。

首先,我有一个类层次结构,如

Select Id_Partition = dense_rank() over(order by country),
       RowNum = row_number() over(partition by country order by name),
       [name], country
 from yourtable

接下来,我有一个包含多个方法的类,所有方法名称相同但带有派生类参数的不同签名

interface IA {}
class A : IA {}
class B : A {}

编译器不会抱怨,它会识别所有不同的签名

class Test
{
  public int Method(object dummy) { return 0; }
  public int Method(IA dummy) { return 1; }
  public int Method(A dummy) { return 2; }
  public int Method(B dummy) { return 3; }
}

所有这些都是我想要的。

现在回答我的问题。我必须在反射过程中确定四种方法中哪一种最符合给定参数类型的签名,即,如果参数类型是typeof(A),我必须找到带有“A dummy”签名的第三种方法。

“IsInstanceOfType”或“IsAssignableFrom”不起作用,因为“A”也是“object”的实例。我可以先检查类型是否完全匹配,但只有在我不接受接口时才能解决问题。

有人有建议吗?

1 个答案:

答案 0 :(得分:0)

您可以简单地使用Type.GetMethod,它将为您指定的参数类型找到最合适的方法。

typeof(Test).GetMethod("Method", new[] { typeof(Object) }) // Object
typeof(Test).GetMethod("Method", new[] { typeof(IA) }) // IA
typeof(Test).GetMethod("Method", new[] { typeof(A) }) // A
typeof(Test).GetMethod("Method", new[] { typeof(B) }) // B
typeof(Test).GetMethod("Method", new[] { typeof(CultureInfo) }) // Object
typeof(Test).GetMethod("Method", new[] { typeof(int) }) // Object

假设您拥有相同的Test class and a new class C`:

public class C : B
{
}

如果你打电话

typeof(Test).GetMethod("Method", new[] { typeof(C) })

您将获得Test.Method (B dummy),因为类型C没有重载,而B类型的重载是最适用的类型(如果您传递类型的对象将被调用的那个) C它。)