C# 是否可能有匿名类的类成员?
我试图创建一个类,其中包含匿名类型的字段。这是用于Json反序列化的 我找不到编译器可以接受的语法。我正在努力:C# 是否可能有匿名类的类成员?,c#,visual-studio-2010,anonymous-class,C#,Visual Studio 2010,Anonymous Class,我试图创建一个类,其中包含匿名类型的字段。这是用于Json反序列化的 我找不到编译器可以接受的语法。我正在努力: class Foo { var Bar = new { int num; } var Baz = new { int[] values; } } 这应该表示这个示例Json对象: { "Bar": { "num": 0 } "Baz": { "values": [0, 1, 2] } } 这是可能的,
class Foo {
var Bar = new {
int num;
}
var Baz = new {
int[] values;
}
}
这应该表示这个示例Json对象:
{
"Bar": { "num": 0 }
"Baz": { "values": [0, 1, 2] }
}
这是可能的,还是我必须用完整的类标识符来声明每个类?您可以使用匿名类型初始值设定项来声明字段。。。您不能使用隐式类型变量。因此:
using System;
class Test
{
static object x = new { Name = "jon" };
public static void Main(string[] args)
{
Console.WriteLine(x);
}
}
。。。但是您不能将x的类型更改为变量。不,这是不可能的。实现这一点最直接的方法是像您所说的那样简单地创建类。这是我的建议
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; }
}
另一种丢失静态类型检查的方法是将其键入对象或动态:
可能可以编写一个自定义的类来序列化这样的类,因为示例中的每个匿名类型中只有一个实值;如果你的真实类型更复杂,这将不适用于那些类型
[JsonConverter(typeof(MyFooConverter))]
class Foo {
public int Bar { get; set; }
public int[] Baz { get; set; }
}
是的,这是可能的 当然,你可以在一行中输入
var Foo = {Bar = new {num = 0}, Baz = new {values = new List<int>()}};
使用Foo作为类编辑更新的.Net fiddle是的,在我的情况下,它在x上没有静态。我假设我不能为Name声明类型,但必须为编译器指定初始值才能推断类型?@NikosC.:是的,您必须指定一个值,C中的匿名类型是不可变的;编译器根据该值推断属性的类型。嗯,我如何访问成员?这不起作用:测试=新测试;test.x.Name=@不,不会的。如果你真的需要,你可以使用动态输入,或者反射。。。但基本上匿名类型并不是为用作字段而设计的。如果没有隐式输入,你将无法获得大部分好处。啊,这真是一个糟糕的问题。我习惯了C++结构的方式来执行这个结构测试{Struts{String name;} x;};然后你就可以做:测试;test.x.Name=;。可惜C不允许这样。更实际的做法是完全声明类,而不是处理运行时反射或任何其他运行时机制。我希望减少标识符污染,因为没有人会直接使用所有的类,因此实际上不值得命名。
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>()}};