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)
{
}

2番目の方法

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

その他...ツリーモデルのプロパティは異なります。例えば ​​:

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

これらすべてのツリーモデルに対して1つのメソッドを作成することは可能ですか?何か提案や出発点はありますか?

ありがとう...

4

4 に答える 4

2

不平を言うプライベートメソッドを作成し、さまざまなタイプのオーバーロードされたメソッドを保持することをお勧めします。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

それはそれらの方法で何が起こるかに依存します。さまざまなツリーモデルにはさまざまなプロパティがあると言います。メソッドのロジックには、一般的でないプロパティが必要ですか?これらの各メソッドのロジックが同じである場合は、次のように実行できます。

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

あなたの質問は少し紛らわしいですが、私は理解していると思います。単一の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();
}

どのように封鎖されているのかわからなかったので、コードに含めませんでしたが、封鎖されているという理由だけで、プロパティの異なる命名規則に従うのは悪い形式です。

JSON.Netを使用すると、非常に簡単になります:http://james.newtonking.com/projects/json/help/index.html?topic=html/ SerializationAttributes.htm

于 2013-03-26T16:30:25.683 に答える
0

すべてのツリーを作成してインターフェースを実装すると、それが可能になります。

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
}

そしてその方法:

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 に答える