Как добавить метод save() для классов, которые имеют DataContract?

У меня класс с DataContract это можно сохранить в файл:

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace Test
{
    [DataContract]
    public class Data
    {
        [DataMember]
        public float Value;

        public static void Main(string[] args)
        {
            Data data = new Data();
            data.Value = 2.3F;

            data.Save(@"D:\result.txt");
        }

        public void Save(string path)
        {
            FileStream stream = new FileStream(path, FileMode.OpenOrCreate);
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Data));

            serializer.WriteObject(stream, this);
        }
    }
}

У меня есть другие занятия с [DataContract] что я тоже хочу сохранить. Я не хочу повторять код в каждом классе. Как я могу добавить Save() метод для всех классов, которые имеют [DataContract] ?

В идеале это будет работать в методе расширения с сериализатором в качестве параметра, но какой тип ??? быть?

public static class SaveExtension
{
    public static void Save(this ??? serializable, string path, DataContractSerializer serializer)
    {
        FileStream stream = new FileStream(path, FileMode.OpenOrCreate);

        serializer.WriteObject(stream, serializable);
    }
}

1 ответ

Решение

Просто сделайте ваш метод расширения универсальным:

    public void Save<T>(this T obj, string path)
    {
        FileStream stream = new FileStream(path, FileMode.OpenOrCreate);
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));

        serializer.WriteObject(stream, obj);
    }

Тогда это будет работать для любого типа.

Обратите внимание, что вы можете создать сериализатор в методе save, поскольку ему передается тип во время выполнения.

Другие вопросы по тегам