我有几个看起来相同的集合,但对不同类型的集合项进行操作,如下所示:
[CollectionDataContract(ItemName = "Culture")]
public sealed class Cultures : List<LangCult>
{
}
这里的重要代码是CollectionDataContract
属性,它允许我们将此集合序列化为带有DataContractSerializer
的XML文件。整个集合被序列化为一个XML文件,名为集合类的名称,例如Cultures.xml
我想提出一个存储库,它正好有一个存储库接口,可以处理所有可能的集合,例如public class Slugs : List<string>
。
我尝试过这样的事情,但我不知道这是否是最好的选择:
public interface ICollectionsRepository<T> where T : IEnumerable
你的想法?
请不要回复有关如何序列化的说明,因为这不是问题所在,而是让它有效。
答案 0 :(得分:0)
也许我应该说我想要一个带有通用项目的泛型集合的接口,其中项目有一个共同的基类。这就是我解决它的方式,希望有一天有人觉得它很有用。
/// <summary>
/// This repo enables us to work with serialisable collections. Collection class has
/// to inherit from IEnumerable and must be described with CollectionDataContract attribute
/// </summary>
/// <typeparam name="T"></typeparam>
public interface ICollectionsRepository<T, V> where T : Collection<V>
{
/// <summary>
/// Get collection from datastore
/// </summary>
/// <returns>List of items</returns>
T Load();
/// <summary>
/// Add new collection item to datastore
/// </summary>
/// <param name="item">Item to be added to the collection</param>
void Add(V item);
}
public class XmlCollectionsProvider<T, V> : ICollectionsRepository<T, V> where T: Collection<V>, new() where V: CollectionItem
{
private readonly string _file = Path.Combine(XmlProvider.DataStorePhysicalPath, typeof(T).Name + ".xml");
public T Load()
{
if (!DefaultsExist()) {
CreateDefaults();
}
DataContractSerializer dcs = new DataContractSerializer(typeof(T));
T obj = null;
XmlDictionaryReader reader =
XmlDictionaryReader.CreateTextReader(new FileStream(_file, FileMode.Open, FileAccess.Read),
new XmlDictionaryReaderQuotas());
obj = (T)dcs.ReadObject(reader, true);
reader.Close();
return obj;
}
public void Add(V item)
{
T collection = Load();
collection.Add(item);
Save(collection);
}
}
[CollectionDataContract(ItemName = "Culture")]
public sealed class Cultures : List<LangCult> { }
[DataContract]
public class LangCult : CollectionItem
{
...
}
[DataContract]
public abstract class CollectionItem
{
[DataMember]
public string Id
{
get;
set;
}
}