Как добавить метод 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, поскольку ему передается тип во время выполнения.