2012-02-17 6 views
1

現在、C#/ Silverlightでエミュレータを構築中です。特定のソフトウェアドメインをエミュレートしているため、エミュレータの範囲内で実装する必要があるドメインレベルのクラス(Cube、CubeSet、BaseAppなど)があります。さらに、これらのドメインレベルのクラスは、エミュレートされるアプリケーションからアクセス可能であるため、アプリケーション開発者が利用できる必要があります。コンパイル済みの型を現在の名前空間型にキャスト

ドメインレベルのクラスだけをコンパイルしたエミュレータ実装自体に、同じドメインレベルのクラスのパッケージがある.dllがあります。

目的は、実行可能なアプリケーションオブジェクトを動的にインスタンス化し、そのアプリケーションのメソッドのシーケンスを呼び出してエミュレーションを実行することです。しかし、メソッドの1つを呼び出す際には、エミュレータ実装内でインスタンス化されるドメインレベルのオブジェクトを渡す必要があります。動的にインスタンス化されたアプリケーションでAssociateCubes(CubeSetパラメータを使用)を呼び出す必要があります。私が動的にそれをやろうとすると、InvalidCastExceptionが発生します。(面白いことに) "CubeSet"オブジェクトを "CubeSet"オブジェクトとしてキャストできないと言っています。動的アプリケーションにアクセスするために使用されているコードの例である:

Object o = Activator.CreateInstance(appType); 
MethodInfo AssocCubes = o.GetType().GetMethod("AssociateCubes"); 
AssocCubes.Invoke(o, new object[] { Cubes }); 

キューブエミュレータ内型CUBESETのものであり、ユーザによって与えられるAPPTYPEがあります。

コンパイラが実際に同じクラスを認識するように、またはコンパイル時に2つのクラスが完全に区別され、そのような方法で一方の型のオブジェクトは他方の型としてキャストされます。

私が考えた解決策の1つは、あるオブジェクトの内容をエミュレータ内のインスタンスに手動でコピーする方法を定義することですが、その問題は、アプリケーション開発者がアプリケーションクラスを使用するための独自のメソッドを定義できるということですヘルパーメソッドとして。

私はすべてを完全に説明していないかもしれないので、潜在的な解決策を明らかにする説明を提供することができます。

+0

ユニットテストフレームワーク(RhinoMockなど)を見ましたか?彼らはそのようなクラスの置換をサポートします。 –

答えて

0

私は前回の回答を値引きしたくはありませんが、私が書いたコメントに記載されている解決策を見つけました。

私が代わりに行うのは、エミュレータプロジェクトからドメイン層を取り出してDLLとして個別にコンパイルすることです。 DLLがエミュレータと別のアプリケーションで参照されるようになったので、タイプが動的にロードされると、結局同じタイプとみなされます。

1

InvalidCastExceptionは完全なクラス名の最後の部分のみを表示しますが、完全なID(完全な名前(名前空間を含む)とそれが出てくるアセンブリ(署名されている場合は強い名前を持つ可能性があります)と比較されます。

オブジェクトを「モックする」ためにユニットテストフレームワークを使用することを検討してください。あるいは、少なくともそのようなフレームワークがクラ​​スをどのようにラップするのかを読んでください。

本当の修正点は、テスト可能なクラス階層を使用することです。多くの場合、インタフェースを使用してコンテキストクラスを作成すると、問題が発生した場合にこのタイプを解決できます。

+0

私はそれを確かに調べるでしょう。エミュレータプロジェクト自体からドメインレベルを除外することができない場合は、私は今思っています。その後、エミュレータは.dllを参照し、アプリケーションは.dllを参照します。これは、あなたが言及したのと同じ "完全なアイデンティティ"を持つように解決するでしょうか? –

+0

あなたがうまく動作するソリューションを見つけてうれしく思います - 同じクラスを使用するのは非常に良いアプローチです。 –