2010-08-02 4 views
28

Ich habe diesen Code in einer Schleife durch ein Objekt und alle seine Eigenschaften durch Reflexion erhalten:Wie erkenne ich mithilfe von Reflektionen Eigenschaften, die über Setter verfügen?

foreach (var propertyInfo in typeof(TBase).GetProperties(BindingFlags.Public | BindingFlags.Instance)) 
{ 
    var oldValue = propertyInfo.GetValue(oldVersion, null); 
} 

Wie kann ich auf Eigenschaften tun aussehen einen Scheck an nur, dass ein „Set“ auf sie haben? (Ich will nur Lese-Werte ignorieren -. Nur "Get")

+1

Vergessen Sie nicht, über Eigenschaften mit privatem, geschützten, internem oder internen geschützt Etter .... diesen Querulanten. –

+0

@ Dr.Wily'sApprentice Können Sie mir erklären, warum das notwendig ist? (vor allem die privaten) Ich meine, ist es sogar möglich, durch Reflexion auf private Felder und Immobilien zuzugreifen? - Wohh .. habe es nachgeschlagen ... es ist möglich. Ich habe nichts gesagt. – LuckyLikey

Antwort

29

Meine erste Antwort war falsch - Bitte geben Requisiten STO Antwort unten:

propertyInfo.CanWrite (documentation)

oder

propertyInfo.GetSetMethod (documentation)

+0

Das sieht für mich die sauberste Methode aus. – mpenrow

+2

Ich glaube nicht, dass Sie BindingFlags.SetProperty verwenden können, um Eigenschaften mit Setter abzufragen. Dieses Flag kann verwendet werden, wenn Sie eine Aktion ausführen möchten, bei der eine Eigenschaft tatsächlich festgelegt wird, z. B. mit der Type.InvokeMember-Methode. –

+13

Dies funktioniert nicht. Verwenden Sie eine der beiden Methoden, die von STO vorgeschlagen wurden, und lesen Sie den Kommentar von Dr. Wilys Lehrling in Bezug auf die Unterschiede zwischen ihnen. – JonathanK

12
propertyInfo.GetSetMethod() != null 
71

PropertyInfo.CanWrite (documentation)

oder

PropertyInfo.GetSetMethod (documentation)

+0

Dies wird definitiv funktionieren, aber Sie müssen eine zusätzliche Überprüfung für jede Eigenschaft vornehmen. Durch das Festlegen von BindingFlags.SetProperty werden nur Eigenschaften abgerufen, die Setter enthalten. –

+14

Ich würde empfehlen, die PropertyInfo.GetSetMethod und überprüfen, ob es Null ist; Die PropertyInfo.CanWrite-Methode gibt true zurück, wenn für die Eigenschaft eine private, geschützte oder interne Gruppe definiert ist. Es gibt nur false zurück, wenn auf dem Grundstück tatsächlich kein Setter vorhanden ist. –

+0

Dieser funktioniert perfekt. – vtortola

Verwandte Themen