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

时间:2015-11-24 16:52:55

标签: c# c#-4.0

我有大量的类共享相同的方法名称,但不共享共同的基础/接口。我无法触及这些类,但是,我可以调用该方法而不管定义类吗?

例如:

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
}

2 个答案:

答案 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,依此类推。

相关问题