型パラメーターを強制的に別の型のサブタイプにする方法を知っています。
public interface IMapping<T2>
{
public void Serialize<T3>(T3 obj)
where T3 : T2;
}
...
var mapping = MapManager.Find<Truck>();
mapping.Serialize(new TonkaTruck());
型パラメータを強制的に別の型のスーパータイプにする方法はありますか?
public interface IMapping<T2>
{
public void IncludeMappingOf<T1>()
where T2 : T1; // <== doesn't work
}
...
var mapping = MapManager.Find<Truck>();
// Truck inherits Vehicle
// Would like compiler safety here:
mapping.IncludeMappingOf<Vehicle>();
mapping.Serialize(new TonkaTruck());
IsSubclassOf
現在、実行時に insideを使用して T1 と T2 を比較する必要がありますIncludeMappingOf
。コンパイルセーフなソリューションが望ましいでしょう。何か案は?
編集: デザインの臭いが少なくなるように例を変更しました。
注:リンクされた質問は非常に似ていますが、適切な回答はありません。うまくいけば、この質問はその質問にも光を当てます。
編集#2:
より簡単な例:
public class Holder<T2>
{
public T2 Data { get; set; }
public void AddDataTo<T1>(ICollection<T1> coll)
//where T2 : T1 // <== doesn't work
{
coll.Add(Data); // error
}
}
...
var holder = new Holder<Truck> { Data = new TonkaTruck() };
var list = new List<Vehicle>();
holder.AddDataTo(list);
コンパイラ: 引数の型 'T2' は、パラメーターの型 'T1' に割り当てられません。 はい、わかっています。T2 がパラメーター タイプ T1 に割り当て可能な場合のみを許可するようにコンパイラーを取得しようとしています。