2010-10-26 19 views
6

Ich muss eine Funktion erstellen, die alle Eigenschaften eines Objekts (einschließlich einer untergeordneten Objekte) erhalten Dies ist für meine Fehlerprotokollierungsfunktion. Momentan gibt mein Code immer 0 Eigenschaften zurück. Bitte lassen Sie mich wissen, was ich falsch mache, danke!Reflection-Klasse, um alle Eigenschaften eines Objekts zu erhalten

public static string GetAllProperiesOfObject(object thisObject) 
{ 
    string result = string.Empty; 
    try 
    { 
     // get all public static properties of MyClass type 
     PropertyInfo[] propertyInfos; 
     propertyInfos = thisObject.GetType().GetProperties(BindingFlags.Public | BindingFlags.Static);//By default, it will return only public properties. 
     // sort properties by name 
     Array.Sort(propertyInfos, 
        (propertyInfo1, propertyInfo2) => propertyInfo1.Name.CompareTo(propertyInfo2.Name)); 

     // write property names 
     StringBuilder sb = new StringBuilder(); 
     sb.Append("<hr />"); 
     foreach (PropertyInfo propertyInfo in propertyInfos) 
     { 
      sb.AppendFormat("Name: {0} | Value: {1} <br>", propertyInfo.Name, "Get Value"); 
     } 
     sb.Append("<hr />"); 
     result = sb.ToString(); 
    } 
    catch (Exception exception) 
    { 
     // to do log it 
    } 

    return result; 
} 

hier, was das Objekt wie folgt aussieht: alt text alt text

+0

Die (IPAddress, MerchantSessionId, etc) sind Eigenschaften und keine Felder, richtig? –

+0

Reed, ich bin mir nicht sicher. Jedoch bin ich daran interessiert, alle Felder und Eigenschaften zu bekommen. Einschließlich aller Unterobjekte. – aron

Antwort

6

Wenn Sie alle Eigenschaften, versuchen:

propertyInfos = thisObject.GetType().GetProperties(
     BindingFlags.Public | BindingFlags.NonPublic // Get public and non-public 
    | BindingFlags.Static | BindingFlags.Instance // Get instance + static 
    | BindingFlags.FlattenHierarchy); // Search up the hierarchy 

Einzelheiten BindingFlags sehen.

+0

Hallo Reed, danke. Ich habe das hinzugefügt, aber ich bekomme immer noch 0 Eigenschaften. Ich habe Bilder zu meinen Fragen hinzugefügt, siehe oben. Vielen Dank! – aron

0

Ihr propertyInfos Array gibt 0 Länge für eine meiner Klassen zurück. Ändern der Zeile zu

Ergebnisse in es wird ausgefüllt. Daher ist diese Codezeile Ihr Problem. Es erscheint, wenn Sie das Flag

zu Ihren Parametern hinzufügen, es wird die gleichen Eigenschaften wie der parameterless Anruf zurückgeben. Wird das Problem durch Hinzufügen dieses Parameters zu Ihrer Liste behoben?

EDIT: Nur Ihre Bearbeitung gesehen. Basierend auf dem Code, den du gepostet hast, hat es auch nicht für mich funktioniert. Durch das Hinzufügen der BindingFlags.Instance wurden Eigenschaften für mich zurückgegeben. Ich würde vorschlagen, den genauen Code zu veröffentlichen, mit dem Sie Probleme haben, da Ihr Screenshot anderen Code zeigt.

+0

Hallo, der obige Code ist mein aktueller Code. Im Screenshot versuchte ich Reed Copseys Vorschlag. – aron

+0

können Sie den Code auf einem einfacheren Objekt versuchen, um zu sehen, ob es funktioniert? Wenn nicht, können Sie den Code der Klasse posten, in der Sie ihn gerade verwenden? – mike

2

Das Problem mit Ihrem Code ist die PayPal-Antwort Typen sind Mitglieder, keine Eigenschaften. Versuchen Sie:

MemberInfo[] memberInfos = 
    thisObject.GetMembers(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance); 
+2

Ein Hinweis hier: Ein Mitglied ist alles, sei es Variable, Methode, Ereignis oder Eigenschaft nicht statisch innerhalb einer Klasse definiert. Mitgliedsvariablen werden 'Felder' genannt. Entweder Abfrage Felder und Eigenschaften getrennt oder alternativ Abfrage aller Mitglieder und filtern Sie es auf diejenigen mit einem 'MemberType' von 'MemberTypes.Field' oder' MemberType.Property'. –

Verwandte Themen