我知道如何强制类型参数成为另一种类型的子类型:
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
来比较T1和T2,以便在IncludeMappingOf
中使用。最好是一种编译安全的解决方案。有什么想法吗?
编辑: 将示例更改为不那么设计有问题。
注意:链接的问题非常相似,但没有合适的答案。希望这个问题也能为那个问题提供一些启示。
第二次编辑:
更简单的示例:
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的情况!
Holder
,你指定它应该至少包含T2
个对象,但是你想要添加少于这个数量的对象。这违反了多态原则,Holder
已经完成了它被要求做的工作。 - Simon Rapilly