.NET
ジェネリックでワイルドカードを機能させる方法を探しています。
私のコードは次のとおりです。
private class Rule<TSource, TSelected> where TSource : class where TSelected : class
{
// stuff in here
}
ルールは同じでも異なる<>
ルールのリストを作成できるようにしたいと考えています。TSource
TSelected
反変の汎用インターフェイス IRule<TSource, in TSelected>
を作成し、そのリストを作成する必要があります。さらにTSelected
、意味のあるクラスに制約されます。既存のコードのように任意の参照型に制約するとコンパイルは行われますが、TSelected
.
現時点では、バリアント ジェネリックを使用する他の方法はありません (もちろん、リフレクション モードList<dynamic>
または同等のものを使用する場合を除きます)。したがって、このソリューションが機能しない場合は、再設計する必要があります。
TSelected
クラスに同じスーパークラスがある場合は、のリストを作成できますRule<TSource, TSelectedSuperClass>
。typeof ( http://msdn.microsoft.com/en-us/library/58918ffs(v=vs.71).aspxTSelected
) を使用して、オブジェクトを再度読み取った後に正確なサブクラスを取得できると思います。
または、両方を含むコンテナ クラスを作成し、正確なタイプを格納することもできます。
スーパークラスの代わりにインターフェイスがそれを行うことができます。ただし、Selected が実装を共有する場合、私は抽象クラスを好みます。