Dynamic Objects und Reflektion



  • Hallo zusammen,

    seit dem Release von .Net 4.0 ist es ja mit dem dynamic -Schlüsselwort möglich dynamische Objekte zu erstellen.

    Ich habe eine Klasse die diese Funktionalität implementiert. Diese soll serialisiert werden. Beim Serialisieren greift die Drittanbieter-Bibliothek per Reflection auf meine Klasse zu. Leider werden dabei die zur Laufzeit erstellten Eigenschaften nicht erkannt.

    Gibt es irgendeine Möglichkeit, mit der ich die Eigenschaften per Reflection verfügbar machen kann?



  • Hallo,

    kommt darauf an wie dein Object aufgebaut ist, wenn du die Properties intern speicherst, geht es ca so:

    Dynamisches Object:

    public class DynamicDict:DynamicObject
        {
            private Dictionary<string, object> _internalDict = new Dictionary<string, object>();
    
            public override bool TryGetMember(GetMemberBinder binder, out object result)
            {
                return _internalDict.TryGetValue(binder.Name,out result);
            }
            public override bool TrySetMember(SetMemberBinder binder, object value)
            {
                _internalDict[binder.Name] = value;
                return true;
            }
        }
    

    und abruf beim client:

    dynamic dict = new DynamicDict();
                 dict.Name = "Hallo";
                 Console.Write(dict.Name);
    
                 Type t = dict.GetType();
                 FieldInfo info = t.GetField("_internalDict", BindingFlags.NonPublic | BindingFlags.Instance);
                 MethodInfo info1 = info.FieldType.GetMethods()[4]; //get_Item - Method
    
                 string name = null;
                 object[] o = new object[1];
                 o[0] = "Name";
                 name = info1.Invoke(info.GetValue(dict), o);
    

    mfg serial



  • Hallo,

    vielen Dank erst einmal für deine Antwort.

    Die Implementierung meines dynamischen Objektes sieht so ziemlich wie das aus, was du gepostet hast. Allerdings habe ich den Code der per Reflection auf mein Objekt zugreift nicht. Was erschwerend hinzukommt ist, dass die einzige virtuelle Methode von DynamicObject , die beim Reflection-Zugriff aufgerufen wird GetMetaObject ist.

    Ich vermute(!), dass hier der einzig mögliche Weg, wenn überhaupt, liegt um einem Aufrufer, der sich das Objekt per Reflection anschaut, die generierten Properties unterzuschieben.



  • du kannst ja einen wrapper um dieses objekt mitliefern, der das interne dictionary per reflection nach aussen weitergibt.

    Nur muss der Client wenn die Properties vorher wirklich nicht klar definiert sind, über iteratoren oder strings auf diese zugreifen.

    mfg
    serial


Anmelden zum Antworten