专业的编程技术博客社区

网站首页 > 博客文章 正文

C#技巧:匿名类如何形成数组与序列化?

baijin 2024-10-15 08:30:29 博客文章 7 ℃ 0 评论

C#技巧:匿名类如何形成数组与序列化?

说下我的实际使用场景,免得友友们以为这是“屠龙术”、啥也不是。

WebAPI接口开中,返回值一般是对业务结果对象进行验证、筛选、加工、变型、组合等操作之后再返回。这就形成很多只在接口返回值时使用的临时对象或对象数组,比如:

1、聚合多个业务结果,形成一个临时返回对象或临时对象数组;

2、对业务结果,附加一些汇总等属性;

3、业务结果对象属性太多,返回对象需要去除一些不需要的属性;

4、业务返回命名元组对象,接口返回json;命名元组序列化时,会丢失命名,变为:item1、itme2、itemx

这些场景就适合使用匿名类,或元组转匿名类。

特别的:

匿名类如何形成数组或list<匿名类>

1、纯数组(不能动态添加)

var anonymous = new { Name = "王高峰", Age = 11 };

var anonymous2 = new { Name = "王高峰2", Age = 22 };

var list1 = new[] { anonymous,anonymous2 };

2、初始化器(不能动态添加)

var list2 = new[]

{

new { FirstName = "张", LastName = "小菲" },

new { FirstName = "李", LastName = "大壮" }

};

3、动态增、减的列表:List<匿名类>

直接写 List<{string Name, int Age}> a = new () 是不行的,必须借助与 自动类型推断或者Linq

方式一:类型推断:集合初始化器,缺点是创建之后就有一项,当然可以用Where语句过滤掉初始项

var enumerable_1 = new[] { new { Name = "小王", Age = 22 } };

//过滤初始项:where 或者 Skip 方法

var enumerable_2 = new[] { new { Name = "小王", Age = 22 } }.Where(e => false);

var enumerable_2_2 = new[] { new { Name = "小王", Age = 22 } }.Skip(1);

方式二:使用 Select 方法,初始项可控制

var enumerable_3 = new int[0].Select(x => new { Id = 0, Name = "" });

var enumerable_3_2 = "王".Select(x => new { Id = 1, Name = x + "小明" });

方式三:使用 Range 方法,初始项可控制

var enumerable_4 = Enumerable.Range(0, 0).Select(e => new { ID = 1, Name = ""});

方式四:使用 Repeat 方法,初始项可控制

var enumerable_5 = Enumerable.Repeat(new { ID = 1, Name = "" }, 0);

//或者

var anonymous = new { Name = "王高峰", Age = 11 };

var enumerable_6 = Enumerable.Repeat(anonymous, 1);

元组(列表)转匿名类(列表):

//元组

List<(string Name, int Age)> tupleList = new List<(string Name, int Age)>()

{

new ("张三",12),

new ("王五",96),

};

//转为匿名类列表

var anonymousList = tupleList.Select(u => new {Nmae =u.Name, Age =u.Age});

//使用 Newtonsoft.Json 序列化json, 避免直接序列化元组出现 item1 item2的问题

var jsonText = Newtonsoft.Json.JsonConvert.SerializeObject(anonymousList);

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表