2012-05-08 10 views
2

私はの強いタイプののオブジェクトを持っています。 List<Activity>と言ってください。 Activityには、多くのプロパティ、たとえばTitle,IdParentActivityChildrenActivitiesActivityTypeなどがあります。リストは階層型です。つまり、リスト内の各アクティビティに子アクティビティがあり、各子アクティビティに独自の子アクティビティがある可能性があります。そうです。匿名型(または動的)を持つ別の階層リストに階層リストを投影しますか?

サードパーティのJavaScript UIライブラリで使用できるように、このリストをJSONに変換する必要があります。ただし、ターゲットリストには、元のリストのプロパティのサブセット、たとえばIdTitleが含まれています。

私は多くのタイプと同じ条件の多くの場所があるので、私はターゲットリストのタイプを定義したくないので、強いタイプのターゲットを持っていません。つまり、私はList<SubActivity>を持っておらず、私はSubActivityクラスを作りたくありません。

どのようにしてこの階層的変換を実行し、ターゲットリストからJSON文字列を取得できますか? dynamicキーワード匿名のタイプを使用することは可能ですか?

アップデート:私は、この階層を変換する必要があり、今

List<Activity> activities = ActivityManager.GetActivitiesHierarchically(); 

Activityであることを想像:

public class Activity 
{ 
    public int Id { get; set; } 

    public ActivityType Type { get; set; } 

    public string ActivityTitle { get; set; } 

    public string Description { get; set; } 

    public Activity? Parent { get; set; } 

    public List<Activity> Children { get; set; } 
} 

と私は、このクラスのインスタンスの階層リストを持っていますリストをJSON文字列に変換しますが、たとえばDescriptionなどのプロパティをレンダリングする必要はありません。したがって、リストをJSONにシリアル化する前に、投影(ある種の変換)を行う必要があります。

public class JsonActivity 
{ 
    public int id { get; set; } 

    public string title { get; set; } 

    public List<JsonActivity> items { get; set; } 
} 

しかし、このパターンは、異なるタイプのために私のコードの多くの場所で繰り返されているので、私はJsonEntityのDTOを定義する必要はありません:私は次のようであるJsonActivity名前付きの型を作成することがあります。

オンザフライで投影による階層変換を行う方法はありますか?

+0

あなたは、理想的には、正確にあなたが望む何をすべきかをより詳細に記述することができます例を挙げて? 「たくさんの場所」とはどういう意味ですか? 'Activity'に似たいくつかの階層型がありますか?あるいは、いくつかの場所で 'Activity'を使うだけですか?これらの場所の違いは何ですか? – svick

+0

あなたはどのJSONシリアライザを使用していますか? – AakashM

+0

** .NET Framework **から 'JavaScriptSerializer'を使用しています。 –

答えて

2

私はC#で再帰的な匿名型を作成できないと思うので、それらを使用しようとすると動作しません。

しかし、結果をJSONとしてシリアル化するため、代わりにDictionary<string, object>を使用してください。

しかし、ラムダは再帰的でなければなりません。それを解決するには、パラメータとして自分自身を取るラムダ書き込むことができます。

delegate IDictionary<string, object> RecursiveSelector<TSource>(
    RecursiveSelector<TSource> selector, TSource source); 

static IEnumerable<IDictionary<string, object>> RecursiveSelect<TSource>(
    this IEnumerable<TSource> source, 
    RecursiveSelector<TSource> selector) 
{ 
    return source.Select(x => selector(selector, x)); 
} 

をあなたは、このようにそれを使用することができます。

List<Activity> activities = …; 
var result = activities.RecursiveSelect(
    (s, a) => 
    new Dictionary<string, object> 
    { 
     { "id", a.Id }, 
     { "title", a.ActivityTitle }, 
     { "children", a.Children.Select(c => s(s, c)).ToArray() } 
    }); 
+0

この回答は私が欲しかったものではありませんでしたが、私の仕事を完了するのに役立ちました。しかし、強く型付けされた階層リストを匿名階層リスト**に投影することはできないようです**。 –

+0

それは私が言ったことです:再帰的な匿名型を作成することはできません。 – svick

関連する問題