2016-11-26 7 views
0

Es sieht aus wie Spiegelung der Trägerfelder für Eigenschaften zurückgibt, wenn wie so genannt:Reflection gibt Schutzfelder von schreibgeschützten Eigenschaften zurück?

type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) 

Gibt es eine Möglichkeit alle Felder zurück, die durch den Benutzer in der Klasse ohne Unterstützung Felder/Compiler generierte erklärt wurden Felder/etc.?

EDIT: Ist es sicher, sich auf das Attribut [CompilerGenerated] zu verlassen?

+0

Sicherheit nicht binär ist. Die Frage "ist es sicher" sollte "ist es sicher genug" sein, was wiederum die Gegenfrage "sicher genug für was?" Beachten Sie, dass es möglich ist, Typen zur Laufzeit dynamisch zu erstellen, die Felder enthalten, die von denen in den zur Kompilierung definierten Typen nicht unterscheidbar sind. Beachten Sie auch, dass es gemeinsame Bibliotheken gibt, die solche Typen zur Laufzeit erstellen, und dass in Ihrer Frage keine Informationen darüber enthalten sind, ob Sie sie verwenden. – hvd

Antwort

1

Alle diese Felder sind mit CompilerGeneratedAttribute markiert, so dass Sie wie folgt filtern:

var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) 
      .Where(f => f.GetCustomAttribute<CompilerGeneratedAttribute>() == null).ToArray(); 
Verwandte Themen