2017-10-04 37 views
0

我有2個程序集(外部和本地)。國外議會不能修改。我想擴展一個外部類,以便它現在實現一個本地接口。這在C#中可能嗎?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,但我想使用反射來實現該接口,這樣我可以使用外資類/結構在其現有的形式(即沒有使用繼承)。繼承可能是必要的......

+2

這是無法完成的。你能描述一下你想通過這個來實現嗎?因爲它聽起來像[XY問題](http://xyproblem.info/)給我。 – Xiaoy312

+3

'class Local:Foreign,ILocalInterface'?如果你只需要使用接口,那麼它應該是無關緊要的類實現它。 – taffer

+1

這樣做你想達到什麼目的? – GMR516

回答

9

我可以延長外國類,使得它實現了本地接口

當然,前提是外資類是不密封。 (當然,接觸到當地的項目,等等。)的

// 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已經擴展F.B,根據需要和D實現IFooBar,按要求。注意F.B.Foo即使在基類上也符合IFooBar的合同義務。

如果外部類是密封的,那麼你將不得不使用組合而不是繼承。

但是,我同意評論者的意見,認爲這味道像一個XY問題。你能說出什麼問題嗎真的試圖解決,更詳細嗎?因爲可能有更好的方法來完成你想要的。

0

在狹義上(如擴展方法),擴展接口目前不支持C#語言。但從更廣泛的意義上講,您可以使用繼承或組合,如@埃裏克的回答中所解釋的。

在2015年Roslyn issue 3357中簡要討論了在C#中支持擴展接口。但是,這不能僅由C#編譯器完全實現,因爲它需要CLR支持來確保(ITheAddedInterface)xx之間的引用相等。這個話題似乎現在被放棄了。

其他CIL語言(如F#)具有比C#更靈活的擴展機制。但是C#正在迎頭趕上,如圖所示。在C# language issue no. 164,和視頻A Preview of C# 8

相關問題