我遇到了一个问题。我在我的程序中使用了一个提供接口的外部库,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中编译它们时才有效
我希望这很清楚!
答案 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();