扩展现有界面

时间:2014-03-19 00:11:20

标签: c# dll interface

我遇到了一个问题。我在我的程序中使用了一个提供接口的外部库,IStreamable(我没有这个接口的源代码)。

然后我在我创建的DLL中实现接口,DFKCamera类。

在我当前的程序中(遗憾的是我无法完全修改因为我只是为它编写插件)然后我只能访问在IStreamable接口中定义的DFKCamera方法。但是,我需要访问我在DFKCamera中编写的另一种方法,以使我的插件能够工作(该方法的其余部分并未使用,因此不能在IStreamable中定义)。

是否可以在C#中扩展接口的定义?如果我可以扩展IStreamable接口,那么我可以访问新方法。

原样,情况就是这样:

//In ProgramUtils.DLL, the IStreamable interface is defined
//I have only the .DLL file available
namespace ProgramUtils {
    public interface IStreamable {
       //some methods
    }
}

//In my DFKCamera.DLL
using ProgramUtils;

class DFKCamera: IStreamable {
    //the IStreamable implementation code
    ....
    //the new method I wish to add
    public void newMethod() {}


//In the the program that uses DFKCamera.DLL plugin
//The program stores plugin Camera objects as IStreamable DLLObject;
IStreamable DLLObject = new DFKCamera();
//This means that I cannot access the new method by:
DLLObject.newMethod(); //this doesn't work!

是否有办法使用newMethod声明扩展IStreamamble接口,即使我无法访问IStreamable接口的源代码?

我知道可以使用部分接口定义来定义跨文件的接口,但只有在两个文件中使用partial关键字并且如果在单个.DLL中编译它们时才有效

我希望这很清楚!

3 个答案:

答案 0 :(得分:13)

您可以使用extension method

public static class IStreamableExtensions
{
    public static void NewMethod(this IStreamable streamable)
    {
        // Do something with streamable.
    }
}

答案 1 :(得分:7)

您可以使用自定义界面继承接口:

public interface IDFKStreamable : IStreamable
{
    void NewMethod();
}

然后,实现自定义接口的任何对象也必须实现IStreamable,您只需在代码中使用自定义接口:

public class DFKCamera : IDFKStreamable
{
    // IStreamable methods

    public void NewMethod() {}
}

// elsewhere...

IDFKStreamable DLLObject = new DFKCamera();
DLLObject.NewMethod();

由于它仍然是IStreamable,您仍然可以将其用作现有代码中的一个:

someOtherObject.SomeMethodWhichNeedsAnIStreamable(DLLObject);

答案 2 :(得分:2)

当你需要使用newMethod()时,为什么不把它再投回到DFKCamera以便你可以使用它呢?

IStreamable DLLObject = new DFKCamera();
((DFKCamera)DLLObject).newMethod();