gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:29 25 4
gpt4 key购买 nike

我有一个强类型对象列表。说 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com