我有下面的代码,它接受包含XML和JSON的文件,并将JSON / XML反序列化为对象
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>();
JSON
{
Name: Red Route,
Meters:
[
{
__type: "WindowsFormsApplication1.Classes.Meter, WindowsFormsApplication1",
MeterID: 1,
SerialNumber: 12345
},
{
__type: "WindowsFormsApplication1.Classes.Meter, WindowsFormsApplication1",
MeterID: 2,
SerialNumber: SE
}
]
}
[
1,
441,
2
]
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>
虽然从表面上看这确实很好,但它有一个主要的缺点,它使用扩展方法,这些方法都扩展了字符串数据类型
我真正希望能够做的事情就是说
var xml = File.ReadAllText("WalkOrder.xml");
var xmlTest = new MeterWalkOrder();
xmlTest.LoadFromXML(xml);
如何使用扩展对象而不是字符串的扩展方法来完成?
我不喜欢当前的方法,因为它没有足够的灵活性,它会强制创建新对象。例如,使用当前方法,如果我有一个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;
}
}
如果我使用以下代码......
var testJson = new MeterWalkOrder();
testJson.Meters.Add(new Meter() { SerialNumber = "Meter 1" });
testJson.Meters.Add(new Meter() { SerialNumber = "Meter 2" });
testJson.PopulateFromJson();
...
在PopulateFromJson之后我希望保留对象 - 但是因为fromJson返回一个新对象它不是 - 所以我的对象只包含距离JSON文件2米的距离,我实际上希望它们被添加到列表的末尾 - 在我希望使用现有对象不要创建新对象
保