是否可能有匿名类的类成员

本文关键字:成员 可能有 是否 | 更新日期: 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; }
}
另一种失去静态类型检查的方法是将其键入为objectdynamic:
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; }
}