【问题标题】:Method with different signature but derived from each other具有不同签名但相互派生的方法
【发布时间】:2017-07-10 10:03:42
【问题描述】:

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

首先我有一个类层次结构

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 dummy”签名的第三种方法。

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

有人有建议吗?

【问题讨论】:

  • 你想通过这个实现什么?重载的作用完全相同,在运行时调用适当的函数。请提及一个用例,以便我们更好地理解问题。
  • 请说明为什么相等检查不能解决接口问题。
  • 不能在IA中使用枚举,并在每个类的构造函数中设置它的值吗?然后你检查枚举的值并手动调用具体方法。
  • 我在序列化过程中获取参数类型和值,调用类型可能是字符串,在我的例子中它必须回退到对象。用例要复杂得多,因为我在序列化过程中得到的参数与被调用方法中的顺序不同,我必须先对它们进行排序。

标签: c# method-signature derived-types


【解决方案1】:

您可以简单地使用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 classC`:

public class C : B
{
}

如果你打电话

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

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

【讨论】:

  • 感谢您的回答,但请检查我上面的评论。由于我得到的参数类型可能与预期方法的顺序不同,因此我无法使用您的建议。但我想我会做一个混合。当我以您的方式找到合适的方法时,我会调用此方法,否则我会尝试重新排序我的参数,在这种情况下类型必须匹配。
猜你喜欢
  • 2010-09-29
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 2014-08-31
相关资源
最近更新 更多