476 Stimmen

Eine generische Liste anonymer Klassen

In C# 3.0 können Sie anonyme Klassen mit der folgenden Syntax erstellen

var o = new { Id = 1, Name = "Foo" };

Gibt es eine Möglichkeit, diese anonymen Klassen zu einer generischen Liste hinzuzufügen?

Exemple :

var o = new { Id = 1, Name = "Foo" };
var o1 = new { Id = 2, Name = "Bar" };

List<var> list = new List<var>();
list.Add(o);
list.Add(o1);

Ein weiteres Beispiel:

List<var> list = new List<var>();

while (....)
{
    ....
    list.Add(new {Id = x, Name = y});
    ....
}

10voto

Code Name Jack Punkte 2359

Sie können eine Liste von dynamischen erstellen.

List<dynamic> anons=new List<dynamic>();
foreach (Model model in models)
{
   var anon= new
   {
      Id = model.Id,
      Name=model.Name
   };
   anons.Add(anon);
}

"dynamisch" wird durch den ersten hinzugefügten Wert initialisiert.

8voto

Brackus Punkte 89

Hier ist eine weitere Methode zur Erstellung einer Liste anonymer Typen, die es Ihnen ermöglicht, mit einer leeren Liste zu beginnen, aber trotzdem Zugang zu IntelliSense zu haben.

var items = "".Select( t => new {Id = 1, Name = "foo"} ).ToList();

Wenn Sie das erste Element beibehalten wollen, fügen Sie einfach einen Buchstaben in die Zeichenfolge ein.

var items = "1".Select( t => new {Id = 1, Name = "foo"} ).ToList();

7voto

user_v Punkte 8882

Hier ist mein Versuch.

List<object> list = new List<object> { new { Id = 10, Name = "Testing1" }, new {Id =2, Name ="Testing2" }}; 

Auf diese Idee bin ich gekommen, als ich etwas Ähnliches für die Erstellung einer anonymen Liste für einen benutzerdefinierten Typ geschrieben habe.

7voto

Tom Dee Punkte 2328

Ich bin sehr überrascht, dass niemand Sammlungsinitialisierer vorgeschlagen hat. Auf diese Weise können nur Objekte hinzugefügt werden, wenn die Liste erstellt wird, daher der Name, aber es scheint der schönste Weg zu sein, es zu tun. Keine Notwendigkeit, ein Array zu erstellen, dann konvertieren Sie es in eine Liste.

var list = new List<dynamic>() 
{ 
    new { Id = 1, Name = "Foo" }, 
    new { Id = 2, Name = "Bar" } 
};

Sie können jederzeit die object anstelle von dynamic aber dann versuchen, es in einer echten generischen Weise zu halten dynamic macht mehr Sinn.

6voto

Jakob Flygare Punkte 79

Stattdessen:

var o = new { Id = 1, Name = "Foo" }; 
var o1 = new { Id = 2, Name = "Bar" }; 

List <var> list = new List<var>(); 
list.Add(o); 
list.Add(o1);

Sie könnten dies tun:

var o = new { Id = 1, Name = "Foo" }; 
var o1 = new { Id = 2, Name = "Bar" }; 

List<object> list = new List<object>(); 
list.Add(o); 
list.Add(o1);

Sie erhalten jedoch einen Compiletime-Fehler, wenn Sie versuchen, so etwas in einem anderen Bereich zu tun, obwohl es zur Laufzeit funktioniert:

private List<object> GetList()
{ 
    List<object> list = new List<object>();
    var o = new { Id = 1, Name = "Foo" }; 
    var o1 = new { Id = 2, Name = "Bar" }; 
    list.Add(o); 
    list.Add(o1);
    return list;
}

private void WriteList()
{
    foreach (var item in GetList()) 
    { 
        Console.WriteLine("Name={0}{1}", item.Name, Environment.NewLine); 
    }
}

Das Problem ist, dass nur die Mitglieder von Object zur Laufzeit verfügbar sind, obwohl intellisense die Eigenschaften anzeigt id y Name .

In .net 4.0 besteht eine Lösung darin, das Schlüsselwort dynamisch Vorort von Objekt im obigen Code.

Eine andere Lösung ist die Verwendung von Reflexion, um die Eigenschaften zu erhalten

using System;
using System.Collections.Generic;
using System.Reflection;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            var anonymous = p.GetList(new[]{
                new { Id = 1, Name = "Foo" },       
                new { Id = 2, Name = "Bar" }
            });

            p.WriteList(anonymous);
        }

        private List<T> GetList<T>(params T[] elements)
        {
            var a = TypeGenerator(elements);
            return a;
        }

        public static List<T> TypeGenerator<T>(T[] at)
        {
            return new List<T>(at);
        }

        private void WriteList<T>(List<T> elements)
        {
            PropertyInfo[] pi = typeof(T).GetProperties();
            foreach (var el in elements)
            {
                foreach (var p in pi)
                {
                    Console.WriteLine("{0}", p.GetValue(el, null));
                }
            }
            Console.ReadLine();
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X