c# - 将一个分层列表投影到另一个具有匿名类型(或动态)的分层列表?

标签 c# json dynamic anonymous-types

我有一个强类型对象列表。说List<Activity> 。每个Activity有很多属性,比如 Title , Id , ParentActivity , ChildrenActivities , ActivityType该列表是分层的,即列表中的每个事件可能有子事件,并且每个子事件可能仍然有自己的子事件,依此类推。

我需要将此列表转换为 JSON,以便我可以将其与第三方 JavaScript UI 库一起使用。但是,目标列表仅具有原始列表属性的子集,例如 Id ,和Title .

因为我有很多类型并且很多地方具有相同的条件,所以我不想定义目标列表类型,因此我没有强类型目标。换句话说,我没有List<SubActivity>我不想创建 SubActivity类。

如何即时进行分层转换,然后从目标列表中获取 JSON 字符串?是否可以使用 dynamic关键字,匿名类型

更新:

想象一下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; }
}

我有一个此类实例的分层列表:

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

现在,我需要将此分层列表转换为 JSON 字符串,但我不需要渲染一些属性,包括 Description例如。因此,在将列表序列化为 JSON 之前,我需要进行投影(某种转换)。我可能会创建一个名为 JsonActivity 的类型就像:

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

    public string title { get; set; }

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

但是因为这种模式在我的代码的许多地方针对不同类型重复出现,所以我不想定义 JsonEntity DTO。

有没有办法通过动态投影进行分层转换?

最佳答案

我认为您无法在 C# 中创建递归匿名类型,因此尝试使用它们是行不通的。

但是由于您要将结果序列化为 JSON,因此使用 Dictionary<string, object>相 react 该有效。

但是 lambda 必须是递归的。为了解决这个问题,您可以编写一个将自身作为参数的 lambda:

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() }
    });

关于c# - 将一个分层列表投影到另一个具有匿名类型(或动态)的分层列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10496567/

相关文章:

jquery - 使用 Jquery 获取动态表单字段的值

c# - Web api 客户端 IdSrv3 身份验证中的访问 token

c# - 使 WPF Listview 遵循 Windows 主题

c# - 所选 ListView 项目的数量?

javascript - 将 json 日期转换为 Jackson 的众多日期之一

javascript - 是否有类似 XSLT 的 JavaScript 模板系统?

c# - 将类的属性作为参数传递?

javascript - 如何在 Marklogic JSON 文档中插入多于一个的三元组?

javascript - 无法在客户端编辑json文件

jQuery - 检测复选框何时更改