2012-05-31 12 views
5

私はこの前に尋ねられたと確信していますが、残念ながら私が見つけたのはthisでしたが、それは解決策ではありませんでした。その型が動的に変化するので、私はobjを投げていませんでしたので、このコードは、もちろん動作しませんどのようにオブジェクトを動的にキャストできますか?

private object obj; 

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

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

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

:私の現在のプロジェクトで、私は次のように何かをします。

どのように動的にキャストできますか?

+4

これは、物事を巡る最善の方法ではないようです。コードの種類が私の匂いです。あなたが達成しようとしているもののより大きなコンテキストは何ですか? – FishBasketGordo

+0

これを初期化する以外に、 'obj'で何をするつもりですか? –

+0

@RaymondChen私はクラスライブラリをテストするための簡単なWinFormプロジェクトを作成しました。 – Leri

答えて

9

の3つのオプション:

  • あなたは両方のクラスを制御し、あなたは彼らがあなたが必要なものがすべて含まれ、共通のインタフェースを実装することができた場合は、それを行う - とあなたがしている場合はインターフェイス
  • にキャストC#4と.NET 4を使用すると、動的タイピングを使用できます。変数をprivate dynamic obj;と宣言し、実行時にコンパイルして正しいメソッドを見つけます。
  • それ以外の場合は、reflectionを使用してメソッドを検索して呼び出します。鋳物のポイントの一部として、意味がありません、実行時の型に基づいて

基本的に鋳造は... コンパイラにより多くの情報を与えることであり、あなたは、単純にそれを持っていませんこの場合。

第1の選択肢は、可能な限り達成するのが一番良い方法です。

+1

どうすれば依存性注入 –

+1

インタフェースなしの依存性注入/抽象基底クラス?どうやって?インターフェイスを定義できる場合は、シナリオが最初に十分です – Tilak

+0

インターフェイスではなく、ベースクラスが優れていませんか? a * can-do *(インターフェース)とは対照的に、* is-a *(抽象クラ​​ス)です。タイプが似ていると仮定してコースの性質は同じです – mattytommo

0

私はCreatInstanceB()が実際にMyClassBを使用すべきであると仮定します。あなたが使用できる場合には

((MyClassA)obj).Initialize(); 

...

((MyClassB)obj).Initialize(); 

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

+0

私は、初期化メソッドで、MyClassA、またはMyClassBがわからないと思います。これは質問のポイントです – Tilak

+0

はい、あなたは正しいです。私は質問を編集しました。 @JonSkeetが示唆しているように、 'dynamic'キーワードを使うのが良いでしょう。 – Leri

+0

本当に、それを逃した。私たちはいつでもSkeet氏に頼ることができます。 – Slugart

関連する問題