現在、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つは、あるオブジェクトの内容をエミュレータ内のインスタンスに手動でコピーする方法を定義することですが、その問題は、アプリケーション開発者がアプリケーションクラスを使用するための独自のメソッドを定義できるということですヘルパーメソッドとして。
私はすべてを完全に説明していないかもしれないので、潜在的な解決策を明らかにする説明を提供することができます。
ユニットテストフレームワーク(RhinoMockなど)を見ましたか?彼らはそのようなクラスの置換をサポートします。 –