在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
}

在C#中调用任何共享相同方法名的类

您有许多类,每个类都有一个方法,名称相同,但签名不同。相同的方法名称在这里只是转移注意力,因为它们是不同的方法。

因此,这排除了使用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
    }); 
}

那么至少你可以在AB上做someObj.Method();等等。

您可以使用dynamic关键字或反射。

在这两者中,我更喜欢dynamic。然而,由于构造函数参数也是一种不同的类型,因此您需要执行以下操作:

void method(dynamic obj, dynamic arg)
{
    arg.x = 3;
    obj.M1(arg);
}

我知道你的代码不太可能被设置成这样,但你还没有展示你的方法是如何使用的。最后,如果您无法修改现有的类,这可能是您能做的最好的事情。