C# и массивы анонимных объектов

Что означает такое выражение?

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" }
};

Особенно эти строки: новый {текст = "IIS 7"...}

Как я могу создать массив как это вручную для удовлетворения этому DataSource.

48
задан Nicholas 16 March 2015 в 04:36
поделиться

6 ответов

Это не многомерный массив. Это массив объектов, которые были созданы с использованием инициализаторов объектов с анонимными типами .

40
ответ дан 26 November 2019 в 18:38
поделиться

Похоже на массив анонимных типов.

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

4
ответ дан 26 November 2019 в 18:38
поделиться

Просто добавьте: анонимные типы преобразуются компилятором в реальный объект. Таким образом, код будет изменен на что-то эквивалентное этому (НАМНОГО упрощен, только для того, чтобы показать, что компилятор создаст реальный класс):

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) за кулисами. Преимущество очевидно в том, что я просто избавился от создания класса для этого объекта. В моем примере все объекты также должны выглядеть одинаково. (Очевидно, делать это для любых публичных членов было бы плохой идеей, поскольку компилятор может изменить имя анонимного класса, если вы добавите / удалите некоторые из них)

3
ответ дан 26 November 2019 в 18:38
поделиться

Это делает новый массив объектов, содержащий группу анонимных объектов.

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

не создает хеш, как аналогичный синтаксис, скажем, PHP, а скорее реальный объект с тестом свойств, счетчиком и набором ссылок.

Можно найден хороший грунтовтер для анонимных объектов здесь

Вы должны быть в состоянии использовать тот же синтаксис для создания таких новых структур, значения свойств не должны быть постоянными:

string text = "Azure";
int count = 13;
string link =  "?Tag=Azure";
new {Text = text, Count = count, Link=link }
2
ответ дан 26 November 2019 в 18:38
поделиться

Сначала переформатируем этот код немного:

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 объектов. Эти объекты внутри массива имеют анонимный тип, создаются и инициализируются с помощью new { ... }.

Относительно вашего вопроса, как вы можете вручную создать такой массив в соответствии с источником данных: кажется, что вы делаете именно это с помощью приведенного выше кода.

61
ответ дан 26 November 2019 в 18:38
поделиться

Чтобы вернуть такой массив из функции, которую я использовал:

public object GetAnonymousArray()
{
    var tbl = new List<object>();
    while (___)
    {
        //fill array in cycle
        tbl.Add(new {Text = someString, Count = someInt, Link = link});
    }  
    return tbl;
}
1
ответ дан 26 November 2019 в 18:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: