我试图创建一个其中包含匿名类型字段的类。 (这是针对Json反序列化的。)
我找不到编译器会接受的语法。我正在尝试:
class Foo {
var Bar = new {
int num;
}
var Baz = new {
int[] values;
}
}
这应该代表这个例子Json对象:
{
"Bar": { "num": 0 }
"Baz": { "values": [0, 1, 2] }
}
这是否可能,或者我必须通常使用完整的类标识符声明每个类吗?
答案 0 :(得分:4)
你可以使用匿名类型初始化程序声明一个字段......你不能使用隐式类型(var
)。所以这有效:
using System;
class Test
{
static object x = new { Name = "jon" };
public static void Main(string[] args)
{
Console.WriteLine(x);
}
}
...但您无法将x
的类型更改为var
。
答案 1 :(得分:2)
是的,可以,EXAMPLE
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作为类
答案 2 :(得分:1)
不,这是不可能的。最直接的方法是简单地创建像你所说的类。这就是我的建议。
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; }
}