2009-08-25 5 views
0

現在、私のアプリケーションの後半にオブジェクトがキャストされたタイプを取得しようとしています。これは主に私がこれを働かせることができれば全体的にきれいな人になる狂気の状況のた​​めです。私はうまくいけば私が働くことを望んでいることを説明する次の単体テストを書いた。キャストタイプを取得する

サンプルオブジェクトから動的にIStub型を取得する方法を見つける必要があります。アプリケーションでは、それが渡されたときにオブジェクトがキャストされたものであってもかまいません。これが可能なのかどうかはわかりませんが、そうであればかなりクールです。事前にあなたの助けをありがとう!

+1

なぜ 'Stub'が' IStub'を実装するために 'Stub'を既に宣言しているのなら、' Stub'が 'IStub'を実装しているかどうかチェックしますか? – dtb

+0

「キャストタイプ」とは何ですか?もっと明示してください... –

+1

ヤクをシェービングしているようですね...(http://theagileadvisors.com/the-agile-team/so-there-i-am-shaving-a-yak/) – grenade

答えて

5

持っていないオブジェクトをキャストそのオブジェクトに対する実際の効果。そのクラスが、副作用を生み出した元の値に対して操作を実行した明示的な変換を定義していた場合を除いて...本当にわかりにくく直感的ではない状況。

一般的な解決策としては、コードの観点から見たときと同じオブジェクトであるため、「以前」とは何かを判断する方法がありません。インスタンス自体は同じです。

+0

意味が分かります。オブジェクトとタイプの両方を、私が使用しているメソッドに渡すだけで済むでしょう。 – basicdays

1

私は100%で確認することはできませんが、私はあなたがこれらの線に沿って何かを行うことができるだろうと考えている:

protected static Type GetCast<T>(T obj) 
{ 
    return typeof(T); // NOT obj.GetType(); 
} 

、その後:

public void GettingCastReturnsCastedType() 
{ 
    IStub stub = new Stub(); // casted as an IStub 
    Type type = GetCast(stub); // see what this returns 
} 
+0

私はジェネリックスを使用しますが、実際にこれを実行したい場所には(params object [] iocRegistrations)のメソッドパラメータがあります。これは実際に私が理解しているものからジェネリックを使用することはできません。 – basicdays

1

オブジェクトの型はキャストによって変更されないため、オブジェクトがこの型またはその型にキャストされているかどうかを確認する方法はありません。これは、キャストのターゲットタイプを表す式、変数、またはフィールドの単なる型です。

これは、メソッドのパラメータやフィールドを解析して型を取得するのが最善の方法ですが、コンパイル時に利用できる静的な情報であるため、これはほとんど役に立たないはずです。

私はいつも不思議なことを...あなたは何を達成しようとしていますか?

+0

ハ、そうです、それは良い質問です。私は現在、CSLAとCastle Windsorの両方を使用しています。私の単体テストは、サービスロケータにモックとスタブを設定できるようにするために書かなければならなかったサポート方法で不快になっていました。私は、オブジェクトのリストを受け入れ、キャスト型で登録できるテストヘルパーを書くことを望んでいました。私はちょうどそれを介してループする登録するオブジェクトとタイプの両方を持つ登録クラスを作成することがあります。 – basicdays

関連する問題