C# 作为对象的扩展方法而不是字符串从XML/JSON加载

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

下面的代码获取包含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>();
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();