11

私はこのようなことをしようとしています:

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;

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

編集 私はそれがおそらく最良のデザインの選択ではないように思われることに同意します、それでここに文脈があります。上記のコードのポイントは、MongoDBのリポジトリ基本クラスです。さまざまな種類のテーブルを処理できるようにしたいと思います。したがって、someMethod()は実際には削除されます; TypeAとTypeBはObjectIDGuidです。下部のコードは、IDを文字列として受け入れるタイプに依存しないremoveメソッドの一部です。getObject()は、IDパラメーターを解析するためのメソッドです。

4

1 に答える 1

20

.NET 4およびC#4を使用している場合は、次の目的で使用できますdynamic

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

それ以外の場合は、リフレクションを使用して適切なメソッドを見つけて呼び出す必要があります。オーバーロード解決(非dynamicタイプの場合)は、コンパイル時に実行されます。

TypeATypeBが構造体でない限り、とにかく開梱しないことに注意してください...)

于 2012-04-10T18:08:36.930 に答える