これは少し一般的な質問です。A.dll にクラス X があり、B.dll が A.dll を参照し、C.dll が B.dll を参照しているとします。
ここで、C.dll (コンシューマー コード) で X を使用する必要があります。したがって、私がやりたいことは、B.dll でラッパー クラス X1 を作成し、それをコンシューマー コードで使用することです。では、ここで質問です。X1 を (ほぼ) X の完全なラッパーにする方法は?
ありがとう。
これは少し一般的な質問です。A.dll にクラス X があり、B.dll が A.dll を参照し、C.dll が B.dll を参照しているとします。
ここで、C.dll (コンシューマー コード) で X を使用する必要があります。したがって、私がやりたいことは、B.dll でラッパー クラス X1 を作成し、それをコンシューマー コードで使用することです。では、ここで質問です。X1 を (ほぼ) X の完全なラッパーにする方法は?
ありがとう。
.NET では、X または X から継承するクラスを使用する場合、A.dll を直接参照する必要があります。コンシューマ C.dll が A.dll を直接参照しないようにする場合、2 つの方法があります。X を完全に隠したい場合は、真のラッパーを作成する必要があります (以下の例を参照)。別の方法として、レイト バインディングを使用することもできます (推奨されませんが、C は間接的なアセンブリ参照のみで X にアクセスできます)。
(X を継承するだけでなく) ラッパーが必要な場合は、単純に手動でラッパーを作成することをお勧めします。つまり、X 型のプライベート変数を持つクラス X1 を作成します。X の対応するメンバーを呼び出すことによって、X のすべてのパブリック関数とプロパティを実装します。これは、X のラッパーのみが必要な場合に機能します。このようにして、X を B から隠すことができます (これがあなたの望みだと思います)。
A.dll
public class X {
public int A { get; set; }
public bool DoSomething() {
A++;
}
}
B.dll
public class X1 {
private X X;
X1() {
X = new X();
}
public int A { get { return X.A; } set { X.A = value } }
public bool DoSomething() {
return X.DoSomething();
}
}
技術的にはラッパーではありませんが、C.dll からの直接参照として A.dll を回避したい場合
3 番目の方法は、X をラップするのではなく、C.dll が X を未知のオブジェクトとして使用するようにすることです。このメソッドは、呼び出しサイトと C# の「動的」オブジェクトを利用します。これにより、B.dll は、コンパイル時に C.dll から明示的に参照しなくても、真の X を返すことができます (そうしない正当な理由がある場合)。Microsoft は、オーバーヘッドが非常に低くなるように、C.dll からの各プロパティ/関数呼び出しに対して、いわゆる「呼び出しサイト」を作成します。動的メソッドの良い点は、ラッパーが X への変更に追従することです。悪い点は、C.dll に実行時バインディングがある (コンパイル エラーがない) ことです。
public static class X1 {
public static dynamic New() {
return new X();
}
}
簡単な解決策はほとんどないと思います。タマネギのレイヤー/アーキテクチャを計画していると思います。
'B' のクラス X1 で 'C' のクラス X を継承し、'A' で X1 を使用します。
'C' のクラス X に対して 'B' のクラス X1 にファクトリ メソッドを作成し、'A' で使用します。
「B」のX1に「C」のクラスXのオブジェクトを作成し、必要なすべてのメソッドを記述し、それらのメソッドから元のクラスXへの呼び出しを転送します。