Подтвердить что ты не робот

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

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

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

Как создать такой массив вручную, чтобы он соответствовал этому источнику данных.

4b9b3361

Ответ 2

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

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 { ... }.

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

Ответ 4

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

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

не создает хеш, как подобный синтаксис, например, в php, но скорее настоящий реальный объект со свойствами Test, Count и Link.

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

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

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

Ответ 5

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

Ответ 6

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

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