封装对象列表的方法

时间:2011-11-28 20:05:31

标签: c# oop

我有一个看起来像这样的课程:

public class MyModel{

  public int TheId { get; set; }
  public int ....
  public string ....
}

我有另一个类,它包含几种类型的列表,包括MyModel,并在json中序列化列表。它有几种方法,每种方法都有一种方法。

public class ToJson{

  public string MyModelToJson (List<MyModel> TheListOfMyModel) {

      string ListOfMyModelInJson = "";

      JavascriptSerializer TheSerializer = new ....
      TheSerializer.RegisterConverters(....
      ListOfMyModelInJson = TheSerializer.Serialize(TheListOfMyModel);

      return ListOfMyModelInJson;
   }

   public string MyOtherModelToJson (List<MyOtherModel> TheListOfOtherModel) {....}

   public string YetAnotherModelToJson (List<YetAnotherModelToJson> TheListOfYetAnotherModelToJson) {....}

}

我想要做的是将序列化封装到MyModel中,如下所示:

public class MyModel{

  public int TheId { get; set; }
  public int ....
  public string ....

  public string MyModelToJson()
}

如何将方法封装到对象中,以便它可用于对象列表?

我想过做一个foreach循环但是会变得混乱,因为在调用方法中,你必须操纵列表中每个对象的json字符串并将它们连接起来。

让我知道封装的OO原则适用于这种情况。

感谢您的建议。

4 个答案:

答案 0 :(得分:2)

一种方法是将ToJson定义为接受泛型类型:

public class ToJson<T>{

  public string MyModelToJson (List<T> TheListOfMyModel) {

  string ListOfMyModelInJson = "";

  JavascriptSerializer TheSerializer = new ....
  TheSerializer.RegisterConverters(....

  ListOfMyModelInJson = TheSerializer.Serialize(TheListOfMyModel);
  return ListOfMyModelInJson;
  }
}

答案 1 :(得分:2)

扩展方法!

public static class JsonExtensions
{
  public static string ToJson<T>(this List<T> list)
  {
  }
}

答案 2 :(得分:1)

我不确定我是否理解你的问题,但我认为你想要做的不是返回String而是JsonObjectJsonArrayJsonPrimitive

public class MyModel {

  public JsonObject myModelToJson() ... //this method implements the interface!
}

其中JsonObject是表示json对象的类。

使此类实现一个接口,其中契约是返回值为JsonValue

然后,在ToJson课程中,返回JsonArray

public class ToJson

  public JsonArray myModelToJson(List<things that can be json-ized> myList) ...

}

在完全需要之前,不要将对象/数组/原语序列化为String,并且让库来处理实际的序列化


这是一个令人困惑的答案。

以下是我认为你应该做的事情:

  • 抓住一个体面的json库。理想情况下,它应该是JsonObject s,JsonArrayJsonPrimitive s,它们是JsonElement的子类。我在java中使用了Google gson,但我不知道C#版本会是什么样的。
  • 使用一种方法[{1}}创建一个界面JsonAble - 返回toJson
  • 为所有相关类实现此接口
  • 序列化JsonElement个对象的列表非常简单 - 它变为JsonAble
  • 一个体面的json库应该有一个序列化方法 - 所以你永远不必担心在自己周围扔字符串

答案 3 :(得分:1)

对于它的价值,我根本不会删除该课程。您正在谈论的是为您的模型添加额外的责任,并且显然违反SRP启发式。也就是说,您有一个类,其当前的职责是对数据建模,并且您将负责建模数据并将其数据转换为某种形式,使用现在需要了解的各种服务类。如果模型类封装GUI概念,例如为GUI引发事件,那么它有不同的改变原因 - 如果用于通知GUI的方案发生变化以及转换为JSON的方案是否发生变化。

如果是我,我会让模型继承自基类或定义Matt Fenwick所提到的接口,并让你的ToJson类将一批这些作为输入,处理它们并返回结果。

我理解消除额外类的愿望,并且可能提倡它,如果它只是一个涉及类的数据元素的简单转换,但只要你需要某种服务类来进行操作,它似乎不适合模型对象,因为您现在无法在没有JavascriptSerializer的情况下对数据建模。如果你想对那些你没有序列化的数据建模,那就太尴尬了。

我能想到的最后一件事是,你可以建立一个'b'c'd'e'f'g'h的建议,并将方法捎带到一些现有的服务上,从而消除了课程。如果您在该服务上只有一个实现序列化的泛型方法,则可以删除单独的类,因为您不再需要为每个模型对象类型使用单独的方法。