是否可能有匿名类的类成员
本文关键字:成员 可能有 是否 | 更新日期: 2023-09-27 18:13:06
我试图创建一个类,其中有一个匿名类型的字段。(这是Json反序列化)
我找不到编译器可以接受的语法。我在:
class Foo {
var Bar = new {
int num;
}
var Baz = new {
int[] values;
}
}
这应该代表这个示例Json对象:
{
"Bar": { "num": 0 }
"Baz": { "values": [0, 1, 2] }
}
这是可能的吗,或者我必须用一个完整的类标识符来声明每个类吗?
您可以使用匿名类型初始化器声明字段…你不能使用隐式类型(var
)。
using System;
class Test
{
static object x = new { Name = "jon" };
public static void Main(string[] args)
{
Console.WriteLine(x);
}
}
…但不能将x
的类型更改为var
。
是的,这是可能的,这里是示例
var Bar = new {num = 0};
var Baz = new {values = new List<int>()};
var Foo = new {Bar, Baz};
Console.WriteLine(JsonConvert.SerializeObject(Foo));
当然你可以在一行中输入
var Foo = {Bar = new {num = 0}, Baz = new {values = new List<int>()}};
编辑更新。net使用Foo作为类
不,这不可能。要做到这一点,最直接的方法是像您所说的那样简单地创建类。这就是我要推荐的。
void Main()
{
Console.WriteLine(JsonConvert.SerializeObject(new Foo { Bar = new Bar {
num = 0
},
Baz = new Baz { values = new[] { 0, 1, 2 } }
})); // {"Bar":{"num":0},"Baz":{"values":[0,1,2]}}
}
public class Foo {
public Bar Bar { get; set; }
public Baz Baz { get; set; }
}
public class Bar {
public int num { get; set; }
}
public class Baz {
public int[] values { get; set; }
}
另一种失去静态类型检查的方法是将其键入为object
或dynamic
:
void Main()
{
JsonConvert.SerializeObject(new Foo { Bar = new {
num = 0
},
Baz = new { values = new[] { 0, 1, 2 } }
}); // {"Bar":{"num":0},"Baz":{"values":[0,1,2]}}
}
class Foo {
public object Bar { get; set; }
public object Baz { get; set; }
}
这可能是可以写一个自定义的JsonConverter
来序列化一个类,就像你希望的那样(因为每个匿名类型在你的例子中只有一个真正的值;如果您的实际类型更复杂,这将不适用于那些)。
[JsonConverter(typeof(MyFooConverter))]
class Foo {
public int Bar { get; set; }
public int[] Baz { get; set; }
}