繁体   English   中英

C#:我可以扩展外部类,使其实现本地接口

[英]C#: Can I extend a foreign class such that it implements a local interface

我有2个程序集(国外和本地)。 无法修改外部部件。 我想扩展一个外部类,以便它现在将实现一个本地接口。 这在C#中可能吗?

编辑:我知道我可以执行以下操作:

// foreign.dll
namespace DX {
    public struct Vector3 {
        ...
    }
}

// local.dll
namespace MyDX {
    public static class Extensions {
        public static void MyExtensionMethod( this Vector3 vec, int index ){
            ...
        }
    }
}

我感兴趣的是强制外部类/结构实现特定接口(不使用继承)。 我想将Vector3用作通用类中的类型:

public class MyGeneric<T> where T: IComparable<T> {
    T _value;
}

上面的结构:Vector3没有实现IComparable,但是我想使用反射来实现接口,以便我可以以其现有形式使用外部类/结构(即不使用继承)。 继承可能是必要的...

我可以扩展外部类以使其实现本地接口吗

当然可以,但前提是该外国类别未密封。 (当然,本地项目也可以访问,依此类推。)

// Foreign.DLL
namespace F 
{ 
  public class B 
  {
    public void Foo() { }
  }
}

// Local.DLL
interface IFooBar 
{ 
  void Foo();
  void Bar();
}
class D : F.B, IFooBar
{
  public void Bar() { }
}

在那里, D根据需要扩展了FB ,并且D根据需要实现了IFooBar 请注意,即使IFooBar位于基类上,它也如何FBFoo的合同义务。

如果外部类是密封的,那么您将不得不使用组合而不是继承。

但是,我同意评论员的说法,即闻起来像XY问题。 您能否更详细地说出您真正要解决的问题? 因为可能会有更好的方法来完成您想要的。

从狭义上讲(类似于扩展方法 ),C#语言当前不支持扩展接口 但是从更广泛的意义上讲,您可以按照@Eric的答案中所述使用继承或组合。

2015年, 罗斯林(Roslyn)第3357版简要讨论了在C#中支持扩展接口。 但是,这不能仅由C#编译器完全实现,因为它需要CLR支持以确保(ITheAddedInterface)xx之间的引用相等。 该主题目前似乎已被放弃。

其他CIL语言(例如F#)具有比C#更灵活的扩展机制。 但是C#正在迎头赶上,例如在C#语言第11期中看到的 164 ,以及视频C#8的预览

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM