具有处理序列化能力的Collections仓库实现

| 我有几个集合,它们看起来都一样,但是可以对不同类型的集合项进行操作,如下所示:
[CollectionDataContract(ItemName = \"Culture\")]
public sealed class Cultures : List<LangCult>
{
}
此处的重要代码是
CollectionDataContract
属性,它使我们可以使用
DataContractSerializer
将此集合序列化为XML文件。整个集合被序列化为一个XML文件,该文件名为集合类类型的名称,例如“ 3”。 我想提出一个存储库,确切地说是一个用于存储库的接口,它可以在所有可能的集合上工作,例如
public class Slugs : List<string>
。 我尝试过类似的方法,但是我不知道它是否是最佳选择:
public interface ICollectionsRepository<T> where T : IEnumerable
你的想法? 请不要回答有关如何序列化的说明,因为这不是这里的问题,我已经解决了。     
已邀请:
        也许我应该说我想要一个通用集合的接口,该集合具有通用项目,而通用项目具有通用的基类。这就是我解决问题的方式,希望有一天某人会发现它有用。
/// <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;
    }
}
    

要回复问题请先登录注册