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 convenir à cette source de données.
6 réponses
ce n'est pas un tableau multidimensionnel. C'est un tableau d'objets qui ont été créés en utilisant initialisateurs d'objets avec des types anonymes.
tout d'Abord, laissez reformater 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 comme un tableau de 5 objets. Ces objets à l'intérieur du tableau sont d'un anonyme de type, créé et initialisé en utilisant new { ... }
.
concernant votre question comment vous pouvez créer manuellement un tel tableau pour convenir à la source de données: vous semblez faire exactement cela avec le code ci-dessus.
C'est d'en faire 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 say php le ferait, mais plutôt un objet réel avec les propriétés Test, Count, et Link set.
un bon abécédaire pour les objets anonymes peut être trouvé ici
vous devriez pouvoir utiliser la même syntaxe pour créer de nouvelles structures comme celle-ci, les valeurs des propriétés n'ont pas à être constantes:
string text = "Azure";
int count = 13;
string link = "?Tag=Azure";
new {Text = text, Count = count, Link=link }
juste pour ajouter: les types anonymes sont convertis par le compilateur en un objet réel. Ainsi, le code sera changé en quelque chose d'équivalent (très simplifié, seulement pour montrer que le compilateur va créer 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 modifié pour:
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 un de mes programmes, j'ai un 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);
}
Ceci fonctionne parce que c'est juste une autre classe (j'ai même IntelliSense) en coulisses. Le l'avantage est évidemment que je viens de me sauver de la création d'une classe pour cet objet. Dans mon exemple, tous les objets doivent avoir la même apparence. (Évidemment, faire cela pour n'importe quel membre du public serait une mauvaise idée car le compilateur pourrait changer le nom de la classe anonymous si vous en ajoutez/en supprimez)
Pour retourner un tableau à partir d'une fonction que j'ai utilisé:
public object GetAnonymousArray()
{
var tbl = new List<object>();
while (___)
{
//fill array in cycle
tbl.Add(new {Text = someString, Count = someInt, Link = link});
}
return tbl;
}