扩展现有接口

本文关键字:接口 扩展 | 更新日期: 2023-09-27 17:51:00

我遇到了一个问题。我在我的程序中使用一个外部库,它提供了一个接口,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!

是否有一种方法来扩展istreamble接口与newMethod声明,即使我没有访问源的istreamble接口?

我知道可以使用部分接口定义来定义跨文件的接口,但是,只有在跨两个文件使用部分关键字并且这些文件在单个。dll中编译时才有效

我希望这足够清楚!

扩展现有接口

您可以使用扩展方法:

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

您可以从自定义接口继承:

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);

在需要使用newMethod()的时候,为什么不直接将其转换回DFKCamera,以便您可以使用它?

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