2

プラットフォーム:C#2.0 WinForms

送信するタイプに応じて特定のデータマッパーのインスタンス化を提供するファクトリクラスがあります。コードは次のとおりです。

public static IDataMapper<T> GetMapper<T>() where T: IDto
{
    Type mapperType = MapperLocator.GetMapper(typeof(T));

    return (IDataMapper<T>)mapperType.Assembly.CreateInstance(mapperType.FullName);
}

DynamicProxy2を使用して、DTOオブジェクトへのメソッド呼び出しをインターセプトしています。私のインターセプトメソッドでは、Invocation.TargetTypeの型を使用して上記のファクトリを呼び出そうとしています。ただし、これは例外を除いて戻ってきます。

タイプまたは名前空間名'invocation'が見つかりませんでした。

明らかにこれは、ジェネリックメソッドの呼び出しは、コンパイル時に理解していることから明示的に型を知る必要があるためです。明らかに、この場合はそれを行うことができず、すべてのDTOオブジェクトに対してswitchステートメントを実行することは絶対にありません。

それで、皆さんは戦略を提案したり、私が間違っていることを指摘したりできますか?私はこれを可能な限り一般的にして、すべてのオブジェクトと新しいオブジェクトに適合し、他のプロジェクトへのコードの移植性を実現できるようにしようとしています。

前もって感謝します!

4

2 に答える 2

3

私は DTO に精通していないため、ここに完全なソリューションを提供するのに十分な情報があるかどうかを知ることができません。そうは言っても、別の答えはほとんど正しいです。C# コンパイラは、コンパイル時に型情報を必要とします。

ただし、これを回避する方法があります: リフレクションです。 System.Reflection (特にあなたの場合はMethodInfoだと思います) を使用すると、完全に汎用的なソリューションを作成できます。

私が質問を正しく理解していれば、そのファクトリ関数の MethodInfo を取得し、型をMakeGenericMethodに置き換えてから、それを呼び出します。

于 2009-07-16T22:18:04.283 に答える
0

残念ながら、これを回避する方法はありません。.NET C# コンパイラは、ジェネリックのコンパイル時に Type を認識する必要があります。別の方法を見つける必要があります。

おそらく、ボックス化/ボックス化解除と非ジェネリックを使用できますが、これをどのように実装するかについてはあまり知りません。または、 を使用することもできますSystem.Reflection。繰り返しますが、これを行う方法がわかりません。

于 2009-07-16T22:01:37.200 に答える