簡體   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