Casablanca: Anonymes Objekt zusammenstellen.

Hallo Forum,

ich muss ein Anonymes Objet zusammenstellen:

myList.Add(new { id = myId, name = myName, property1 = myValue1,  property2 = myValue1 })

Die property1 und property2 mussen jenachdem, was vom Benutzer ausgewählt wurde, benannt werden, z.B.

myList.Add(new { id = myId, name = myName, pizza = 'salami',  salat = 'gemischt' }) oder
myList.Add(new { id = myId, name = myName, steak = 'RumpSteak',  salat = 'gemischt' })

Die Die property1 und property2 werden einer Methode als Parameter übergeben.

public void MyMethod(string property1, string property2) {
  myList.Add(new { id = myId, name = myName, ... });
}

Ich muss also einen Weg finden, die Namen dynamisch ändern zu können. Hat jemand Ahnung, wie man dies bewrkstelligen kann?

Gruß

  1. Ahoi Casablanca

    warum "new"?

    Warum kannst Du die Properties nicht setzen oder mitgeben?

    <script>
    var obj = {prop: "none"};
    var createObj = function (obj, prop) {
        "use strict";
        obj.prop = prop;
        return obj;
    };
    var newObj = createObj(obj, "newprop");
    alert(newObj.prop);
    </script>
    

    Dank und Gruß,

    bob from berlin

    1. Hi,

      danke für die Antwort. Der Hintergrund ist folgende: Ich habe eine Liste von anonymen Objekten (C#), die alle gleich struckturiert sind. Ich mus nun an einer oder anderen Stelle einige Lücken füllen. Demsprechend müssen die erzeugten Objekten natürlich gleich strukturiert sein.

      Gruß

      1. Ahoi Casablanca

        Hi,

        danke für die Antwort. Der Hintergrund ist folgende: Ich habe eine Liste von anonymen Objekten (C#), die alle gleich struckturiert sind. Ich mus nun an einer oder anderen Stelle einige Lücken füllen. Demsprechend müssen die erzeugten Objekten natürlich gleich strukturiert sein.

        Ja, aber wo ist das Problem? Du übergibst der Funktion das Standardobjekt, und gleich den Namen oder was mit und setzt es dann

        standardObj.popertyXY = parameterValue;
        

        Oder geht das in C# nicht?

        Dank und Gruß,

        bob from berlin

  2. Tach!

    ich muss ein Anonymes Objet zusammenstellen:
    Die property1 und property2 mussen jenachdem, was vom Benutzer ausgewählt wurde, benannt werden,
    Ich muss also einen Weg finden, die Namen dynamisch ändern zu können.

    C# ist nicht PHP. Der Compiler muss den Typ kennen oder aus dem anonymen Objekt sich selbst einen Typ generieren können. Er kann das nicht erst zur Laufzeit. Eigenschaften nach Belieben hinzufügen ist nicht drin.

    Es gibt nur den Datentyp dynamic und die DLR (Dynamic Language Runtime). Damit kann man solche "Schweinereien" machen. Aber man büßt auch allen Komfort der starken Typisierung ein und handelt sich einen Sack voll neuer potentieller Probleme ein. Beispielsweise dass einige Fehler erst zur Laufzeit und nicht bereits vom Compiler erkannt werden können.

    Ich rate davon ab und schlage stattdessen vor, richtige Typen zu verwenden. Wie wolltest du bei deinem Vorgehen prüfen, ob das Ding eine Pizza oder ein Steak ist? Mit Reflection nachschauen, ob das Objekt eine bestimmte Eigenschaft hat oder nicht? Keine gute Idee, weil du dann die Eingenschaftsnamen als String angeben musst. Damit ist auch wieder die starke Typisierung ausgehebelt.

    Wenn es denn etwas variables sein soll, dann würde ich eher eine Pizza-Klasse und eine Steak-Klasse und einen gemeinsames Basistyp (oder ein Interface) für deine Liste nehmen. Wenn das zu viele oder gar erst zur Laufzeit bekannt werdende Klassen werden, dann wäre auch eher ein Basistyp mit einem Dictionary für die unterschiedlichen Eigenschaften eine Variante.

    Keiner der Vorschläge erzeugt bei mir gar keine Bauchschmerzen. Ich kann dir auch gar nicht zu etwas konkretem raten, weil ich nicht weiß, wie du dir dann die weitere Verarbeitung dieser variablen Objekte vorstellst.

    dedlfix.

    1. Hallo,

      dnake. Ich weiß erst zur Laufzeit, wie die einzelnen Objekt-Felder (Pizza, Steak, ...) heißen. Daher wieß ich auch beim Auslesen der Objekte, auf welche Properties ich zugreifen muss. An dieser Stelle ist keine Probleme vorhanden. Es gibt da dozende Properties. Dafür eine Klasse anzulegen bedeutet, dass man ein Haufen leeren Felder mitschleppen muss, obwohl man zu einem Zeitpunkt nur 3-4 Felder benötigt.

      Gruß

      1. Tach!

        Ich weiß erst zur Laufzeit, wie die einzelnen Objekt-Felder (Pizza, Steak, ...) heißen. Daher wieß ich auch beim Auslesen der Objekte, auf welche Properties ich zugreifen muss.

        Müssen das unbedingt Properties sein? Sind Einträge in einem Dictionary keine Lösung?

        dedlfix.

        1. Hi,

          danke. Wie gesagt. ich habe eine Liste von anonaymen Objekten in er Form von:

          {id = 124, datum = 2015.01.10 00:00:00, aa = 12.3, bb = 456.05 }
          {id = 124, datum = 2015.01.12 00:00:00, aa = 12.3, bb = 456.05 }
          ...
          

          Ich muss nun bezüglich der Tage die Lücken füllen:

          {id = 124, datum = 2015.01.10 00:00:00, aa = 12.3, bb = 456.05 }
          {id = 124, datum = 2015.01.11 00:00:00, aa = null, bb = null }
          {id = 124, datum = 2015.01.12 00:00:00, aa = 12.3, bb = 456.05 }
          ...
          

          Ein dictionary hilft an dieser Stelle leider nicht.

          Gruß

          1. Tach!

            Wie gesagt. ich habe eine Liste von anonaymen Objekten in er Form von:
            Ich muss nun bezüglich der Tage die Lücken füllen:
            Ein dictionary hilft an dieser Stelle leider nicht.

            Doch keine Speisen? Wie soll man dann eine individuell passende Lösung vorschlagen, wenn du das Problem mit was anderem umschreibst, für das eine andere Lösung geeigneter erscheint?

            {id = 124, datum = 2015.01.10 00:00:00, aa = 12.3, bb = 456.05 }
            {id = 124, datum = 2015.01.11 00:00:00, aa = null, bb = null }
            {id = 124, datum = 2015.01.12 00:00:00, aa = 12.3, bb = 456.05 }
            ...
            

            Jetzt sieht das eher danach aus, als ob du die Nullable-Datentypen suchst.

            dedlfix.

            1. Hi,

              danke. Meine Frage war: wie kann man die Namen eines anonymen Objektes zur Laufzeit setzen? Hier aa und bb, die jenachdem cc, dd, ee, ff, ... sein können? Diese werde ich erst zur Laufzeit als Parameter erhalten. Daraus möchte ich dann ein anonymes Objekt erzeugen.

              Gruß

              1. Tach!

                Meine Frage war: wie kann man die Namen eines anonymen Objektes zur Laufzeit setzen?

                Ja, das war deine Frage. Und auf nur genau diese einzugehen, ist die Antwort: Geht nicht. Anonym ist nicht gleichzusetzen mit dynamisch.

                Aber dein eigentliches Problem ist doch, wie du deine Aufgabenstellung gelöst bekommst. Und dazu muss man diese kennen und nicht nur eine Frage zu einer Lösung, die schon halb in der Sackgasse steckt.

                dedlfix.