C# 具有不同签名但彼此派生的方法

C# 具有不同签名但彼此派生的方法,c#,method-signature,derived-types,C#,Method Signature,Derived Types,我有一个非常有趣的问题,还没有找到任何答案。希望有人能帮助我 首先,我有一个类层次结构,如 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 i

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

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

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; }
}
编译器不会抱怨,它能识别所有不同的签名

new Test().Method(new Object()) returns 0
new Test().Method(new A() as IA) returns 1
new Test().Method(new A()) returns 2
new Test().Method(new B()) returns 3
一切如我所愿

现在来问我的问题。在反射过程中,我必须确定四种方法中哪一种最适合给定参数类型的签名,也就是说,如果参数类型是typeof(a),我必须找到第三种具有“a伪”签名的方法

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

有人有什么建议吗?

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

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
假设您有相同的
测试类和一个新类
C`:

public class C : B
{
}
如果你打电话

typeof(Test).GetMethod("Method", new[] { typeof(C) })
您将获得
Test.Method(B dummy)
,因为类型
C
没有重载,而
B
类型的重载是最适用的(如果将类型
C
的对象传递给它,将调用该重载)。

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

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
假设您有相同的
测试类和一个新类
C`:

public class C : B
{
}
如果你打电话

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

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

您试图通过此实现什么?重载的作用与此完全相同,在运行时调用相应的函数。请提及一个用例,以便我们更好地理解问题。请澄清为什么平等检查不能解决接口问题。您不能在
IA
中使用枚举并在每个类的构造函数中设置其值吗?然后检查枚举的值并手动调用特定的方法。我将在序列化过程中获取参数类型和值,调用类型可能是字符串,必须返回到示例中的object。用例要复杂得多,因为我在序列化过程中获取的参数的顺序与调用的方法中的顺序不同,所以我必须在之前对它们进行排序。您试图通过这种方式实现什么?重载的作用与此完全相同,在运行时调用相应的函数。请提及一个用例,以便我们更好地理解问题。请澄清为什么平等检查不能解决接口问题。您不能在
IA
中使用枚举并在每个类的构造函数中设置其值吗?然后检查枚举的值并手动调用特定的方法。我将在序列化过程中获取参数类型和值,调用类型可能是字符串,必须返回到示例中的object。用例要复杂得多,因为我在序列化过程中获得的参数的顺序与调用方法中的不同,所以我必须在之前对它们进行排序。感谢您的回答,但请查看我上面的评论。由于我得到的参数类型可能与预期方法的顺序不同,因此我无法使用您的建议。但我想我会做一个混音。当我以您的方式找到合适的方法时,我会调用此方法,否则我会尝试重新排序参数,在这种情况下,类型必须匹配。谢谢您的回答,但请查看我上面的评论。由于我得到的参数类型可能与预期方法的顺序不同,因此我无法使用您的建议。但我想我会做一个混音。当我以您的方式找到一个合适的方法时,我会调用这个方法,否则我会尝试对参数重新排序,在这种情况下,类型必须匹配。