我有一个看起来像这样的课程:
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原则适用于这种情况。
感谢您的建议。
答案 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
而是JsonObject
, JsonArray
或JsonPrimitive
:
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,并且让库来处理实际的序列化。
这是一个令人困惑的答案。
以下是我认为你应该做的事情:
JsonObject
s,JsonArray
和JsonPrimitive
s,它们是JsonElement
的子类。我在java中使用了Google gson,但我不知道C#版本会是什么样的。JsonAble
- 返回toJson
。JsonElement
个对象的列表非常简单 - 它变为JsonAble
。答案 3 :(得分:1)
对于它的价值,我根本不会删除该课程。您正在谈论的是为您的模型添加额外的责任,并且显然违反SRP启发式。也就是说,您有一个类,其当前的职责是对数据建模,并且您将负责建模数据并将其数据转换为某种形式,使用现在需要了解的各种服务类。如果模型类封装GUI概念,例如为GUI引发事件,那么它有不同的改变原因 - 如果用于通知GUI的方案发生变化以及转换为JSON的方案是否发生变化。
如果是我,我会让模型继承自基类或定义Matt Fenwick所提到的接口,并让你的ToJson类将一批这些作为输入,处理它们并返回结果。
我理解消除额外类的愿望,并且可能提倡它,如果它只是一个涉及类的数据元素的简单转换,但只要你需要某种服务类来进行操作,它似乎不适合模型对象,因为您现在无法在没有JavascriptSerializer的情况下对数据建模。如果你想对那些你没有序列化的数据建模,那就太尴尬了。
我能想到的最后一件事是,你可以建立一个'b'c'd'e'f'g'h的建议,并将方法捎带到一些现有的服务上,从而消除了课程。如果您在该服务上只有一个实现序列化的泛型方法,则可以删除单独的类,因为您不再需要为每个模型对象类型使用单独的方法。