C#和匿名对象的数组

时间:2010-01-09 21:24:38

标签: c# asp.net .net arrays anonymous-types

这样的表达是什么意思?

obj.DataSource = new[]
{
    new {Text = "Silverlight", Count = 10, Link="/Tags/Silverlight" },
    new {Text = "IIS 7", Count = 11, Link="http://iis.net" },
    new {Text = "IE 8", Count = 12, Link="/Tags/IE8" },
    new {Text = "C#", Count = 13, Link="/Tags/C#" },
    new {Text = "Azure", Count = 13, Link="?Tag=Azure" }
};

特别是这些行:new {Text =“IIS 7”...}

如何手动创建这样的数组以适应此DataSource。

6 个答案:

答案 0 :(得分:56)

首先,让我们重新格式化that code

obj.DataSource = new[]
{
    new {  Text = "Silverlight",  Count = 10,  Link = "/Tags/Silverlight"  },
    new {  Text = "IIS 7",        Count = 11,  Link = "http://iis.net"     }, 
    new {  Text = "IE 8",         Count = 12,  Link = "/Tags/IE8"          }, 
    new {  Text = "C#",           Count = 13,  Link = "/Tags/C#"           },
    new {  Text = "Azure",        Count = 13,  Link = "?Tag=Azure"         } 
};

这看起来不像是一个多维数组,而是一个包含5个对象的数组。数组中的这些对象是anonymous type,使用new { ... }创建和初始化。

关于如何手动创建适合数据源的数组的问题:您似乎正在使用上述代码完成此操作。

答案 1 :(得分:39)

这不是一个多维数组。这是使用object initializers with anonymous types创建的一系列对象。

答案 2 :(得分:4)

看起来像是一组匿名类型。

http://msdn.microsoft.com/en-us/library/bb397696.aspx

答案 3 :(得分:3)

添加:匿名类型由编译器转换为真实对象。因此代码将更改为相当于此的内容(简化为MUCH,仅显示编译器将创建实际类):

internal sealed class AnonymousClass1
{
    internal string Text { get; set; }
    internal int Count { get; set; }
    internal string Link { get; set; }
}

然后您的代码将更改为:

obj.DataSource = new AnonymousClass1[]
{
    new AnonymousClass1 {Text = "Silverlight", Count = 10, Link="/Tags/Silverlight" },
    new AnonymousClass1 {Text = "IIS 7", Count = 11, Link="http://iis.net" },
    new AnonymousClass1 {Text = "IE 8", Count = 12, Link="/Tags/IE8" },
    new AnonymousClass1 {Text = "C#", Count = 13, Link="/Tags/C#" },
    new AnonymousClass1 {Text = "Azure", Count = 13, Link="?Tag=Azure" }
};

在我的一个程序中,我有这样的代码(简化!):

var myObjects = new []{
    new { Id = Guid.NewGuid(), Title = "Some Title", Description = string.Empty },
    new { Id = Guid.NewGuid(), Title = "Another Title", Description = string.Empty },
    new { Id = Guid.NewGuid(), Title = "Number 3", Description = "Better than No2, but not much" }
}

foreach(var myObject in myObjects) {
    DoSomeThingWith(myObject.Title);
}

这是有效的,因为它只是幕后的另一个类(我甚至得到了IntelliSense)。显而易见的是,我只是为自己创建了一个用于此对象的类。在我的例子中,所有对象也需要看起来一样。 (显然,对任何公共成员执行此操作都是一个坏主意,因为如果添加/删除某些内容,编译器可能会更改匿名类的名称)

答案 4 :(得分:2)

它正在制作一个新的对象数组,其中包含一组匿名对象。

new {Text = "Azure", Count = 13, Link="?Tag=Azure" }

并不像php那样创建类似语法的哈希,而是实际上是一个具有属性Test,Count和Link设置的真实对象。

可以找到匿名对象的好的入门here

您应该能够使用相同的语法来创建这样的新结构,属性值不必是常量:

string text = "Azure";
int count = 13;
string link =  "?Tag=Azure";
new {Text = text, Count = count, Link=link }

答案 5 :(得分:1)

从我使用的函数返回这样的数组:

public object GetAnonymousArray()
{
    var tbl = new List<object>();
    while (___)
    {
        //fill array in cycle
        tbl.Add(new {Text = someString, Count = someInt, Link = link});
    }  
    return tbl;
}