Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可能有匿名类的类成员?_C#_Visual Studio 2010_Anonymous Class - Fatal编程技术网

C# 是否可能有匿名类的类成员?

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] } } 这是可能的,

我试图创建一个类,其中包含匿名类型的字段。这是用于Json反序列化的

我找不到编译器可以接受的语法。我正在努力:

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>()}};