2017-10-04 5 views
0

2つのアセンブリ(外部およびローカル)があります。外部アセンブリは変更できません。外国のクラスを拡張して、ローカルインターフェイスを実装するようにしたいと思います。これはC#で可能ですか?C#:ローカルインターフェイスを実装するように外部クラスを拡張できますか?

EDIT: 私は次の操作を行うことができることを知っている:

私は(継承を使用せずに)特定のインターフェイスを実装するために、外国クラス/構造体を強制されることに興味がどのような
// 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を実装しています。たとえそれが基本クラスにあるとしても、の契約上の義務をどのように満たしているのかに注意してください。

外国のクラスが封印されている場合、継承ではなくコンポジションを使用する必要があります。

しかし、私はXYの問題のような臭いがあると言うコメント者に同意します。 は本当にの問題を解決しようとしていますか?あなたが望むものを達成するためのより良い方法があるかもしれないからです。狭義の

0

(等拡張メソッド)、拡張インターフェースは、現在C#言語でサポートされていません。しかし、より広い意味で、@ Ericの答えで説明されているように、継承や合成を使用することができます。

C#の拡張インターフェイスのサポートについては、2015年にRoslyn issue 3357で簡単に説明しました。ただし、C#コンパイラだけでは、(ITheAddedInterface)xxの間の参照の等価性を保証するためにCLRサポートが必要なため、これを完全に実装することはできません。トピックは今放棄されているようだ。

F#などの他のCIL言語は、C#よりはるかに柔軟な拡張メカニズムを備えています。しかし、C#は追いついています。 C# language issue no. 164で、ビデオはA Preview of C# 8です。

関連する問題