是否可以拥有匿名类的班级成员?

时间:2014-07-14 17:37:01

标签: 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] }
}

这是否可能,或者我必须通常使用完整的类标识符声明每个类吗?

3 个答案:

答案 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; }
}

另一种失去静态类型检查的方法是将其键入为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; }
}