我有一个接口IStorageManager
,它允许我存储数据,不同的实现方式分别用于基于json文件的存储,基于xml文件的存储等。
我具有接口IStorable
,并且我想强制所有实现IStorable
的类都具有[Serializable]标头。因此,在IStorageManager
中,我可以这样实现:
public interface IStorageManager
{
IStorable Load<IStorable>(string Path);
void Save<IStorable>(IStorable objToSave, string path);
}
public class XMLStorageManager : IStorageManager
{
public void Save<T>(T objToSave, string path)
{
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
using (TextWriter writer = new System.IO.StreamWriter(System.IO.Path.GetFullPath(path)))
{
serializer.Serialize(writer, typeof(T));
}
}
}
有没有一种方法可以在界面中指定??
答案 0 :(得分:0)
简短的回答是“否”,您不能通过接口强制执行Attribute。 原则上,接口是关于契约(行为)的,而序列化是关于状态的,而状态通常不会反映在接口中。
您拥有的选项是:
不是使用用于“可存储”对象的接口,而是使用消费者代码应继承的抽象类(例如StorableBase
)。这样做的主要缺点是,它限制了使用者代码可以与您的库一起使用的类的类型。另请注意,在寻找Serializable
属性时,并不是所有的序列化库都检查所有的类层次结构,有些可能只检查具体的类。您还可以在该抽象类上实现ISerializable
接口,以更好地控制序列化过程。 See here for details.
Roslyn引入了代码分析器的概念。您可以创建一个自定义代码分析器,以在编译时检查您的规则。 See here for more details and an example。