C#代码用于处理具有相同方法名称的不同类

rla*_*ter 16 c#

比方说,你有两个不同的C#类A,并B说,虽然不是来自同一个基类派生你分享一些对方法的同名.例如,两个类都有一个connect和一个disconnect方法,以及其他几个类.我希望能够编写一次适用于这两种类型的代码.

这是我想要做的简化示例:

public void make_connection(Object x)
{
  x.connect() ;
  // Do some more stuff...
  x.disconnect() ;
  return ;
}
Run Code Online (Sandbox Code Playgroud)

当然,这不会编译,因为Object类没有connectdisconnect方法.

有没有办法做到这一点?

UPDATE.我应该从一开始就明确这一点:我只有A和B的DLL,而不是源代码.

Zac*_*son 26

您可以使用界面来完成您想要执行的操作.

interface IConnectable
{
    void Connect();

    void Disconnect();
}
Run Code Online (Sandbox Code Playgroud)

双方AB应实施IConnectable.然后使用IConnectable而不是Object作为方法的参数类型,你应该全部设置.

public void MakeConnection(IConnectable connectable)
{
    connectable.Connect();

    // Do some more stuff...

    connectable.Disconnect();
}
Run Code Online (Sandbox Code Playgroud)

编辑:由于您没有源代码,因此您有以下几种选择:

  1. 使用Max的解决方案使用dynamic关键字,(如果您使用的是.NET 4.0)
  2. 使用Steve的使用cast和if/ elsestatements 的解决方案
  3. 为创建包装类AB并让他们实现接口(或使用通用抽象基类为他们)

例如:

class AWrapper : IConnectable
{
    private A obj;

    public AWrapper(A obj)
    {
        this.obj = obj;
    }

    public void Connect()
    {
        this.obj.Connect();
    }

    public void Disconnect()
    {
        this.obj.Disconnect();
    }

    // other methods as necessary
}
Run Code Online (Sandbox Code Playgroud)

(BWrapper会是相似的,只是使用B而不是A)

然后你可以创建包装器并将它们传递进去MakeConnection.这取决于你想要的方式.根据您的情况,一种方法可能比其他方法更容易.

  • 在这里迂腐,但是类不继承*接口,他们*实现*它们. (4认同)
  • 如果您没有A和B的源代码,如何使A和B实现接口? (2认同)

Max*_*Max 11

这将在C#4中起作用:

public void make_connection(dynamic x)
{
  x.connect() ;
  // Do some more stuff...
  x.disconnect() ;
  return ;
}
Run Code Online (Sandbox Code Playgroud)

  • +1更加类型安全你可以拥有强类型公共方法 - `make_connection(A a)` - 委托给私有动态方法. (2认同)