我有大量的类共享相同的方法名称,但不共享共同的基础/接口。我无法触及这些类,但是,我可以调用该方法而不管定义类吗?
例如:
Namespace n1: class A { void M1(n1.CustObj ob1){} }
Namespace n2: class B { void M1(n2.CustObj ob1){} }
是否有可能从这些常见方法/参数中抽象出来,如此?
method(Object obj)
{
obj.M1(new CustObj() {
x = 3;
}); // CustObj can either belong to n1 or n2
}
答案 0 :(得分:2)
您可以使用dynamic
关键字或反射。
在这两者中,我更喜欢dynamic
。但是,由于您的构造函数参数也是不同的类型,因此您需要执行以下操作:
void method(dynamic obj, dynamic arg)
{
arg.x = 3;
obj.M1(arg);
}
我知道您的代码不太可能设置为执行此操作,但您还没有充分说明如何使用您的方法。最后,如果您无法修改现有的课程,这可能是您所能做的最好的事情。
答案 1 :(得分:2)
您有许多类,每个类都有一个方法,名称相同,但签名不同。因此,相同的方法名称是红鲱鱼,因为它们是不同的方法。
这因此排除使用dynamic
或反射来提供可以处理所有这些方法的单个方法,除非您在一种方法中对每种类型进行硬编码测试,或者采用Jonathan Wood的方法。通过CustObj
参数传递现有dynamic
实例的方法。
一种解决方案可能是为每种类型创建扩展方法:
public void Method(this A obj)
{
obj.M1(new n1.CustObj()
{
x = 3
});
}
public void Method(this B obj)
{
obj.M1(new n2.CustObj()
{
x = 3
});
}
等等。那么至少你可以在someObj.Method();
,A
上进行B
,依此类推。