2012-04-10 30 views
10

にC#のオブジェクトをUnboxのために: 私はこのような何かをしようとしているどのように動的型

void someMethod(TypeA object) { ... } 

void someMethod(TypeB object) { ... } 

object getObject() 
{ 
    if (...) return new TypeA(); 
    else return new TypeB(); 
} 

object obj = getObject(); 
(obj.GetType()) obj; // won't compile 
someMethod(obj); 

はもちろん、私はここで混乱しています。

if (obj.GetType() == typeof(TypeA)) obj = (TypeA)obj; 
else if (obj.GetType() == typeof(TypeB)) obj = (TypeB)obj; 

- 実行時にこれを行う方法はありませんか?

EDIT 私はそれがおそらく最良のデザインの選択ではないようだと思うので、ここではコンテキストです。上記のコードのポイントは、Mongo DBのRepository基底クラスです。私はそれが異なる種類のテーブルを扱うことができるようにしたい。したがって、someMethod()は実際にはです。を削除してください。 TypeAおよびTypeBは、、ObjectIDおよびGuidです。一番下のコードはタイプアグノスティックの一部ですのIDを文字列として受け入れるメソッドを削除します。 getObject()はIDパラメータを解析するメソッドです。

+0

は、あなたがそれに関連付けられた実行時型情報付きタイプ 'T'をconflatingている(構造体であるTypeAないとTypeB、とにかくアンボクシング ...ではないことに注意してください) T) 'である。彼らは同じものではなく、お互いに代わることはできません。 –

+0

デザインの選択肢が増える可能性がありますが、コードの実際の目標は投稿から除外されました。おそらく、あなたがこのコードで達成しようとしていたことを教えていただければ、問題に解決策を書く上でより良い、全く異なる方法を提供することができます。 –

+0

@カークウォール、私は違いを知っている、私はちょうど私がやろうとしていたことを説明したい。 – McGarnagle

答えて

20

は、.NET 4とC#4を使用している場合は、このためにdynamicを使用することができます。

dynamic obj = GetObject(); 
SomeMethod(obj); 

そうでない場合は、あなたが見つけると、右のメソッドを呼び出すためにリフレクションを使用する必要があります。オーバーロード解決(dynamicタイプ以外の場合)はコンパイル時に実行されます。 ( `typeof演算:

+0

または 'obj.SomeMethod()'? –

+0

@RobertHarvey:質問が書かれている方法は与えられていません。同じ種類のオーバーロードを選んでいるところです。 –

+0

ニース!!正確に私が探していたもの、ありがとう。 – McGarnagle

関連する問題