1つのオブジェクトを別のタイプにキャストします
-
27-09-2019 - |
質問
私はAという名前の1つのクラスと1つのクラスBを持っています
public class A : UserControl { }
public class B : UserControl { }
クラスの関数がクラスAのオブジェクトを受け入れるアセンブリが1つあります。このアセンブリは私によって作成されていないので、私は何の制御もありません。基本的にはサードパーティアセンブリです。
しかし、クラスBのオブジェクトがビットカスタマイズされているため、私は自分のオブジェクトを提供したいと思っています。クラスAのすべてのプロパティが含まれていることを安心してください。クラスBのオブジェクトをタイプキャップしてタイプAタイプAで、プロジェクトにサードパーティアセンブリを統合し、ニーズに応じてルックアンドフィールをカスタマイズできるようにしますか?
私がそういうことだとしたら (A)objB
それは許可されていません。それから私はこれを試しました:
UserControl control = objB as UserControl;
A objA = control as A;
しかし、この場合の問題は、objaがnullです。
混乱を避けるために:クラスAとアセンブリはサードパーティによって提供されます。
前もって感謝します :)
解決
階層を考えると、コンバージョンオペレーターを作成する必要があります。これを一般的に行うための組み込みの方法はありません(考えてください Dog : Animal
と Cat : Animal
):
public static explicit operator A(B b) {
// code to populate a new instance of A from b
}
ジェネリックリフレクションフレームワークを使用して、
public static void PropertyCopyTo<TSource, TDesination>(
this TSource source,
TDestination destination
) {
// details elided
}
それで、あなたは言うことができます
// b is B
// a is A
b.PropertyCopyTo<A>(a);
その間のすべての共通プロパティをコピーします b
に a
.
他のヒント
にとって B
に鋳造可能である A
, B
しなければならない 継承 A
. 。もしそれでも B
のすべてのプロパティが含まれています A
, 、まだそうではありません A
.
アダプターパターンを使用できます
BをAにキャストできない場合 B is A
)Aから継承せずにあなたがやろうとしていることを達成することは不可能です。残念ながらC#はサポートしていません ダックタイピング 多くの動的言語(つまりRuby)とは異なります。
クラスAから継承することができます:
public class B : A {
}
そして、あなたがいくつかの方法/プロパティをオーバーライドする必要がある場合、それらをに設定するだけです virtual
クラスAでAで
あなたは実際にはできないと思います。
一部のクラスAにプロパティを追加してみませんか?