2011-11-09 14 views
2

オープンジェネリック型のためのvaiableを宣言する方法はありますか?オープンジェネリック型の変数の宣言方法は?可能?

Given:ユーザーがファクトリメソッドから取得するジェネリッククラスのLoggerがあります。任意のロガーを保持できる変数を持つ方法はありますか?

現在、Loggerは、Logger ONLYを継承しています。これは、どのタイプがそこに記録されているかを気にせずにインスタンスの変数を宣言できるためです。

私はMEFを使用していますが、エクスポートでは[エクスポート(typeof(Logger <>)]]という構文を使用して一般的なタイプをエクスポートできます...(インポート時に正確なタイプを指定する)オープンタイプ(少なくともtypeof)では私が今必要とするのは、構文です。

Logger <> Logger {get;セット; }

何か可能性はありますか?この特定の構文は、私に "タイプが必要"となります。

+0

なぜ「オブジェクト」を使用しないのですか? –

+0

@Lasse: 'myObject.Log(something)'がコンパイルエラーを起こす(変数が*参照のみを格納するために使用されていない)ためだと思います。 'dynamic'はオプションになりますが、コンパイル時の構文チェックは失われます。 – Heinzi

+0

それはまさに事です。私はタイプXのロガー(設定用)のロギングサービスに頼んでいますが、特定のジェネリックタイプへのロギングには興味がありません。すべてのものはベースの一部です。私はときどきロガーを(サブクラスなど)渡すかもしれません。彼らは知る必要はありません。私は基本クラスを持つために(ここと他のシナリオで)JUSTを避けようとしています。 – TomTom

答えて

2

Loggerのタイプパラメータがcovariantの場合、つまりout modifierと宣言されている場合は、Logger<object>を使用できます。

IEnumerable<object> = new List<string>; // this works, because IEnumerable is covariant 

ロガーの型パラメータは共変されていない場合、すなわち、あなたがどこか入力パラメータとしてそれを使用する場合、例えばLog(T dataToLog)の場合、共通のインターフェースを実装する(または共通の基本クラスを使用する)ことは、あなたの目標を達成する唯一の方法と思われます。

関連する問題