3

抱歉标题,我找不到正确的。我有不止一种方法可以返回相同的结果。

返回类型

public class JsonTreeView
{
    public int id { get; set; }
    public string text { get; set; }
    public string state { get; set; }
    public string @checked { get; set; }
    public string attributes { get; set; }
    public List<JsonTreeView> children { get; set; }
}

第一种方法

List<JsonTreeView> FromReportTree(List<ReportTree> list)
{
}

第二种方法

List<JsonTreeView> FromLocationTree(List<LocationTree> list)
{
}

和其他......树模型的属性是不同的。例如 :

LocationTree (id, name, parent, text)
ReportTree (sno, name, parent, desc)

是否可以为所有这些树模型编写一种方法?有什么建议或起点吗?

谢谢...

4

4 回答 4

2

我建议您创建一个执行 grunt 工作的私有方法,并为不同类型保留重载方法。从其他方法调用私有方法,并使用从该方法JsonTreeView的特定对象创建对象的函数:

private List<JsonTreeView> FromReportTree<T>(List<T> list, Func<T, JsonTreeView> convert) {
  // loop through the list and call convert to create items
  List<JsonTreeView> result = new List<JsonTreeView>();
  foreach (T item in list) {
    result.Add(convert(item));
  }
  return result;
}

List<JsonTreeView> FromReportTree(List<ReportTree> list) {
  return FromReportTree(list, t => new JsonTreeView(t.id, t.text, ... ));
}

List<JsonTreeView> FromReportTree(List<LocationTree> list) {
  return FromReportTree(list, t => new JsonTreeView(t.sno, t.desc, ... ));
}
于 2013-03-26T16:29:28.253 回答
1

这取决于这些方法中发生的情况。您说各种 Tree 模型具有不同的属性;方法中的逻辑是否需要任何非通用属性?如果每个方法中的逻辑相同,则可以这样做:

List<JsonTreeView> FromReportTree<T>(List<T> list) where T : BaseTree
{
    //some logic
}

假设您有某种BaseTree模型,否则T : class或者只是将其关闭(不推荐)。

如果逻辑不同,您仍然可以通过检查if (list is LocationTree)并使用它来执行特定于的逻辑来执行此操作LocationTree,但这可能会变得混乱。

于 2013-03-26T16:31:16.670 回答
0

If you make all your Trees to implement an interface, you can.

interface iMyTree
{
    int MyTreeID {get; set;}
    string MyTreePame {get; set;}
    object MyTreeParent {get; set;}
    string MyTreeText  {get; set;}
}


class AnyTree : iMyTree
{
     //any properties

     //implements iMyTree
}

And that method:

List<JsonTreeView> FromMyTree(List<iMyTree> list)
{
    //all trees that implement iMyTree will have the same methods, any kind of tree implementing iMyTree can be used.
}
于 2013-03-26T16:32:44.610 回答
0

你的问题有点混乱,但我想我明白了。您需要一个 FromReportTree 函数。

为此,您很可能希望 ReportTree 和 LocationTree 有一个共同的基类。喜欢:

public abstract class ReportLocationTree {
    public int id { get; set; }
}

public class ReportTree : ReportLocationTree {
    public string moreStuff { get; set; }
}

public class LocationTree : ReportLocationTree {
    public string evenMoreStuff { get; set; }
}

List<JsonTreeView> FromReportTree(List<ReportLocationTree> list)
{
    list.Select(t => new JsonTreeView { id = t.id }).ToList();
}

我不确定你是如何进行 serailizing 的,所以我没有将它包含在我的代码中,但是仅仅因为它们被 serailized 就在你的属性上遵循不同的命名约定是一种不好的形式。

JSON.Net 让你很容易:http://james.newtonking.com/projects/json/help/index.html?topic=html/ SerializationAttributes.htm

于 2013-03-26T16:30:25.683 回答