web-dev-qa-db-fra.com

C # et tableaux d'objets anonymes

Que signifie une telle expression?

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

Surtout ces lignes: nouveau {Text = "IIS 7" ...}

Comment puis-je créer un tableau comme celui-ci manuellement pour l'adapter à cette DataSource.

48
Yevhen

Ce n'est pas un tableau multidimensionnel. C'est un tableau d'objets qui ont été créés en utilisant initialiseurs d'objet avec des types anonymes .

40
Mark Byers

Tout d'abord, reformatons ce code un peu:

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

Cela ne ressemble pas à un tableau multidimensionnel, mais plutôt à un tableau de 5 objets. Ces objets à l'intérieur du tableau sont de type type anonyme , créés et initialisés à l'aide de new { ... }.

Concernant votre question sur la façon de créer manuellement un tel tableau en fonction de la source de données: vous semblez faire exactement cela avec le code ci-dessus.

58
stakx

Ressemble à un tableau de types anonymes.

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

4
Kris Krause

Juste pour ajouter: les types anonymes sont convertis par le compilateur en un objet réel. Donc, le code sera changé en quelque chose d'équivalent (BEAUCOUP simplifié, seulement pour montrer que le compilateur créera une classe réelle):

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

Et votre code sera alors changé en:

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

Dans l'un de mes programmes, j'ai du code comme celui-ci (simplifié!):

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

Cela fonctionne parce que c'est juste une autre classe (je reçois même IntelliSense) dans les coulisses. L'avantage est évidemment que je viens de m'empêcher de créer une classe pour cet objet. Dans mon exemple, tous les objets doivent également être identiques. (Évidemment, faire cela pour n'importe quel membre public serait une mauvaise idée car le compilateur pourrait changer le nom de la classe anonyme si vous en ajoutez/supprimez)

3
Michael Stum

Il crée un nouveau tableau d'objets, contenant un groupe d'objets anonymes.

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

ne crée pas un hachage comme une syntaxe similaire dans le cas de php, mais plutôt un véritable objet réel avec les propriétés Test, Count et Link définies.

Une bonne amorce pour les objets anonymes peut être trouvée ici

Vous devriez pouvoir utiliser la même syntaxe pour créer de nouvelles structures comme celle-ci, les valeurs de propriété ne doivent pas nécessairement être constantes:

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

Pour renvoyer un tel tableau à partir d'une fonction que j'ai utilisée:

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
Yevhen