【发布时间】: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