5

私はこれが以前に尋ねられたことをかなり確信していますが、残念ながら私が見つけた唯一のことは私にとって解決策ではなかったこれでした。私の現在のプロジェクトでは、次のようなことをしています。

private object obj;

private void Initialize()
{
    obj.Initialize();
}

private void CreateInstanceA()
{
    obj = Activator.CreateInstance(typeof(MyClassA));
}

private void CreateInstanceB()
{
    obj = Activator.CreateInstance(typeof(MyClassB));
}

objこのコードは、タイプが動的に変化するためキャストしていないため、もちろん機能しません。

どうすれば動的にキャストできますか?

4

2 に答える 2

9

3 つのオプション:

  • 両方のクラスを制御し、必要なものすべてを含む共通のインターフェイスを実装できる場合は、それを行い、インターフェイスにキャストします
  • C# 4 と .NET 4 を使用している場合は、動的型付けを使用できます。変数を as として宣言するだけで、private dynamic obj;コンパイルされ、実行時に適切なメソッドが検出されます。
  • それ以外の場合は、リフレクションを使用してメソッドを見つけて呼び出します。

基本的に、実行時間型に基づくキャストは意味がありません。キャストのポイントの一部は、コンパイラにより多くの情報を提供することです...そして、この場合は単にそれがありません。

最初のオプションは、それを達成できる場合、はるかに優れています。

于 2012-05-31T14:06:42.540 に答える
0

CreatInstanceB() は実際に MyClassB を使用する必要があると思いますが、正しいですか?

その場合、次を使用できます。

((MyClassA)obj).Initialize();

...

((MyClassB)obj).Initialize();

または、Initialize メソッドを持つインターフェイスを作成し、そのインターフェイスとして obj を定義することもできます。

于 2012-05-31T14:08:22.423 に答える