C# 作为对象的扩展方法而不是字符串从XML/JSON加载
下面的代码获取包含XML和JSON的文件,并将JSON/XML反序列化为对象C# 作为对象的扩展方法而不是字符串从XML/JSON加载,c#,xml,json,json.net,extension-methods,C#,Xml,Json,Json.net,Extension Methods,下面的代码获取包含XML和JSON的文件,并将JSON/XML反序列化为对象 using (var streamReader = new StreamReader("output.json")) { var rawJsonToLoad = streamReader.ReadLine(); var jsonWalkOrder = rawJsonToLoad.FromJson<MeterWalkOrder>(); Debug
using (var streamReader = new StreamReader("output.json"))
{
var rawJsonToLoad = streamReader.ReadLine();
var jsonWalkOrder = rawJsonToLoad.FromJson<MeterWalkOrder>();
Debug.WriteLine(jsonWalkOrder.Dump());
}
var xml = File.ReadAllText("WalkOrder.xml");
var xmlTest = xml.LoadFromXML<MeterWalkOrder>();
XML
<MeterWalkOrder>
<Name>Red Route</Name>
<Meters>
<Meter>
<MeterID>1</MeterID>
<SerialNumber>12345</SerialNumber>
</Meter>
<Meter>
<MeterID>2</MeterID>
<SerialNumber>SE</SerialNumber>
</Meter>
</Meters>
</MeterWalkOrder>
如何使用扩展对象而不是字符串的扩展方法来实现这一点
我不喜欢当前的方法,因为它没有足够的灵活性,它迫使创建新对象。例如,使用当前方法,如果我有一个5米的列表,并且我想从一个JSON字符串中再添加10米,我将无法添加,因为fromJson将迫使我重新创建我的米列表,因此我在文件中只保留10米,而不是列表中已经存在的10+5米
保罗
编辑-下面的评论我尝试了一种扩展方法,它实际上完美地演示了我的问题
public static class ObjectExtensions
{
public static T PopulateFromJson<T>(this T obj)
{
using (var streamReader = new StreamReader("output.json"))
{
var rawJsonToLoad = streamReader.ReadLine();
obj = rawJsonToLoad.FromJson<T>();
}
return obj;
}
}
在PopulateFromJson之后,我希望保留该对象-但因为fromJson返回一个新对象,它不是-因此我的对象将只包含JSON文件的2米,我实际上希望它们添加到列表的末尾-简而言之,我希望使用现有对象,而不是创建一个新对象
Paul尝试在
对象上创建扩展方法时遇到了什么问题。我没有尝试过,因为我对扩展方法的语法不是很有信心,特别是当它们与泛型结合时。我来看看这个链接。我希望扩展方法可用于任何类泛型扩展如下所示:public static T Foo(此T条)此方法将返回指定类型的对象。泛型静态方法的另一个示例:public static void Foo(此T条)
var xml = File.ReadAllText("WalkOrder.xml");
var xmlTest = new MeterWalkOrder();
xmlTest.LoadFromXML(xml);
public static class ObjectExtensions
{
public static T PopulateFromJson<T>(this T obj)
{
using (var streamReader = new StreamReader("output.json"))
{
var rawJsonToLoad = streamReader.ReadLine();
obj = rawJsonToLoad.FromJson<T>();
}
return obj;
}
}
var testJson = new MeterWalkOrder();
testJson.Meters.Add(new Meter() { SerialNumber = "Meter 1" });
testJson.Meters.Add(new Meter() { SerialNumber = "Meter 2" });
testJson.PopulateFromJson();