在C#中调用任何共享相同方法名的类
本文关键字:方法 共享 调用 任何 | 更新日期: 2023-09-27 18:24:21
我有很多类共享相同的方法名称,但不共享公共的基/接口。我不能触摸这些类,但是,我可以调用该方法而不考虑定义类吗?
例如:
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
}
您有许多类,每个类都有一个方法,名称相同,但签名不同。相同的方法名称在这里只是转移注意力,因为它们是不同的方法。
因此,这排除了使用dynamic
或反射来提供一个可以处理所有类型的方法的可能性,除非随后对一个方法中的每种类型进行硬代码测试,或者采用Jonathan Wood的方法,通过dynamic
参数传入CustObj
的现有实例。
一种解决方案可能是为每种类型创建扩展方法:
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
});
}
那么至少你可以在A
、B
上做someObj.Method();
等等。
您可以使用dynamic
关键字或反射。
在这两者中,我更喜欢dynamic
。然而,由于构造函数参数也是一种不同的类型,因此您需要执行以下操作:
void method(dynamic obj, dynamic arg)
{
arg.x = 3;
obj.M1(arg);
}
我知道你的代码不太可能被设置成这样,但你还没有展示你的方法是如何使用的。最后,如果您无法修改现有的类,这可能是您能做的最好的事情。