我有以下情况。此代码将为Test2抛出编译器错误
类型'InheritedChild'不能在泛型类型或方法'panelGenericIOGrid'中用作类型参数'T'。没有从“InheritedChild”到“SerializerBase”的隐式引用转换。
public class SerializerBase<T>
{
}
public class DirectChild : SerializerBase<DirectChild>
{
}
public class InheritedChild : DirectChild
{
}
public class panelGenericIOGrid<T> : UserControl
where T: SerializerBase<T>, new()
{
}
...
panelGenericIOGrid<DirectChild> test;
panelGenericIOGrid<InheritedChild> test2;
...
我非常确信我的实施是错误的。我想要以下情况,DirectChild和InheritedChild都会将他们的appropriote类型赋予SerializerBase构造函数。
如何让代码按照需要的方式工作?谢谢!
有关实际信息的一些信息。 SerializerBase有一组静态函数,可以根据类型自动序列化和反序列化。
DirectChild有一组字符串,将存储在磁盘上并恢复。
Inhertiedchild拥有DirectChild的所有成员以及更多成员。
基本上我需要DirectChild.Serialize(filename)和IndirectChild.Serialize(filename),其中Serialize是SerializeBase的公共成员
答案 0 :(得分:2)
问题是InheritedChild
没有实现SerializerBase<InheritedChild>
,因此它无法满足T
中panelGenericIOGrid<T>
的约束。
不幸的是,目前还不清楚解决方案是否因为我们不知道你想要实现的目标。
现实生活中SerializerBase<T>
的成员是什么?如果你能给我们更多的背景,那将有助于我们帮助你。
答案 1 :(得分:1)
在我看来,你错过了一个界面:
public interface ISerializerBase<T> { }
public class SerializerBase<T> : ISerializerBase<T> { }
public class DirectChild : SerializerBase<DirectChild> { }
public class InheritedChild : DirectChild, ISerializerBase<InheritedChild> { }
public class panelGenericIOGrid<T> where T: ISerializerBase<T>, new() { }
我不知道这会如何改变你的设计。您可能需要在InheritedChild
中重新实现一些继承的方法或一些接口方法。
但是,也许你可以这样做otherwise:
public interface MSerializable {}
public static class Serializable {
public static void Serialize(this MSerializable self, string fileName) {
// self will refer to the right type,
// no need to use generics if all you want is to serialize it ...
}
}
public class DirectChild : MSerializable { }
public class InheritedChild : DirectChild { }
public class panelGenericIOGrid<T> where T: MSerializable, new() { }
您是否会进行二进制序列化,还是将其序列化为XML?