Es sind mehrere Szenarien zu berücksichtigen. Zunächst müssen Sie den Typ Ihres Objekts überprüfen. Sie können dazu einfach GetType () aufrufen. Wenn der Typ IDynamicMetaObjectProvider nicht implementiert, können Sie die Reflektion wie für jedes andere Objekt verwenden. Etwas wie:
var propertyInfo = test.GetType().GetProperties();
Bei IDynamicMetaObjectProvider-Implementierungen funktioniert die einfache Reflexion jedoch nicht. Grundsätzlich müssen Sie mehr über dieses Objekt wissen. Wenn es sich um ExpandoObject handelt (eine der IDynamicMetaObjectProvider-Implementierungen), können Sie die von itowlson bereitgestellte Antwort verwenden. ExpandoObject speichert seine Eigenschaften in einem Wörterbuch und Sie können Ihr dynamisches Objekt einfach in ein Wörterbuch umwandeln.
Wenn es sich um DynamicObject handelt (eine weitere IDynamicMetaObjectProvider-Implementierung), müssen Sie die von DynamicObject bereitgestellten Methoden verwenden. DynamicObject ist nicht erforderlich, um die Liste der Eigenschaften irgendwo zu "speichern". Zum Beispiel könnte es so etwas tun (ich verwende ein Beispiel aus meinem Blog-Beitrag wieder ):
public class SampleObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
}
In diesem Fall gibt das Objekt bei jedem Versuch, auf eine Eigenschaft (mit einem bestimmten Namen) zuzugreifen, einfach den Namen der Eigenschaft als Zeichenfolge zurück.
dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
//Prints "SampleProperty".
Sie müssen also nicht über etwas nachdenken - dieses Objekt hat keine Eigenschaften, und gleichzeitig funktionieren alle gültigen Eigenschaftsnamen.
Ich würde sagen, dass Sie für IDynamicMetaObjectProvider-Implementierungen nach bekannten Implementierungen filtern müssen, in denen Sie eine Liste von Eigenschaften wie ExpandoObject abrufen und den Rest ignorieren (oder eine Ausnahme auslösen) können.