Ergebnis 1 bis 3 von 3

C# List<object> übergeben und Typbestimmung

  1. #1 Zitieren
    Waldläufer
    Registriert seit
    Sep 2008
    Beiträge
    134
    Hey ,

    stehe vor folgendem Problem:
    Ich habe eine Klasse, deren Konstruktor eine Liste mit beliebigen Objekten übergeben werden soll. Auch weitere Listen können enthalten sein. In der Klasse soll dann für jede Liste innerhalb der Liste eine neue Instanz der eigenen Klasse angelegt werden, und für Instanzen einer speziellen Klasse soll ein bestimmter Code ausgeführt werden. Jeder Listeneintrag, der nicht der speziellen Klasse zugehörig ist oder selbst eine Liste ist soll ignoriert werden. Sieht dann folgendermaßen aus:

    Public ListControl(List<object> lst)
    {
    foreach (object obj in lst)
    if (obj is List<object>)
    elements.Children.Add(new ListControl((List<object>)obj));
    else if (obj is ControlElement)
    //Do stuff
    }

    die Abfrage "obj is ControlElement" funktioniert, und es wird das richtige ausgeführt. Allerdings gibt die obere Abfrage "obj is List<object>" nur true zurück, wenn die Liste als List<object> erstellt wurde, genauso kann der Konstruktor ebenfalls nur mit einer List<object> aufgerufen werden, obwohl geplant ist, dass dieser (und auch die If Abfrage) beliebige Listen akzeptiert. Also auch List<int> oder List<List<ControlElement>>.
    Hier war eben die Idee Object zu nutzen, da ja letztendlich jede Instanz auch immer ein Object ist. Leider funktioniert es so aber nicht. Hat jemand eine Idee wie man es implementieren könnte, dass beliebige Listen akzeptiert werden?

    mfg
    El
    El Tocho ist offline Geändert von El Tocho (04.08.2015 um 10:34 Uhr)

  2. #2 Zitieren
    Ritter Avatar von Delta 38
    Registriert seit
    Nov 2008
    Ort
    Bremen
    Beiträge
    1.251
    Ich bin mir zwar nicht sicher ob ich dein Problem verstanden habe, aber versuch es doch mal mit der Eigenschaft IsGenericType und der Funktion GetGenericTypeDefinition

    Dein Beispiel würde dann so aussehen:
    Code:
    Public ListControl(List<object> lst)
    {
        foreach (object obj in lst){
           if (obj.GetType().IsGenericType && obj.GetType().GetGenericTypeDefinition() == typeof(List<>)){
                elements.Children.Add(new ListControl((List<object>)obj));
            } else if (obj is ControlElement){
                //Do stuff
            }
        }
    }
    Bei dir fehlten übrigens sämtliche Klammern (Bei dem If-Block nicht so schlimm, aber bei dem foreach-Block schon).

    Gruß
    Delta
    Delta 38 ist offline

  3. #3 Zitieren
    Waldläufer
    Registriert seit
    Sep 2008
    Beiträge
    134
    Hat funktioniert, danke dir
    El Tocho ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •