Angesichts dieser Klasse
class Foo
{
// Want to find _bar with reflection
[SomeAttribute]
private string _bar;
public string BigBar
{
get { return this._bar; }
}
}
Ich möchte das private Element _bar finden, das ich mit einem Attribut markieren werde. Ist das möglich?
Ich habe dies mit Eigenschaften gemacht, bei denen ich nach einem Attribut gesucht habe, aber niemals nach einem privaten Mitgliedsfeld.
Welche Bindungsflags muss ich setzen, um die privaten Felder abzurufen?
c#
.net
reflection
.net-attributes
David Basarab
quelle
quelle
Antworten:
Verwendung
BindingFlags.NonPublic
undBindingFlags.Instance
Flaggenquelle
Sie können es genauso machen wie mit einer Immobilie:
quelle
Ermitteln Sie den Wert der privaten Variablen mithilfe von Reflection:
Stellen Sie den Wert für die private Variable mit Reflection ein:
Wobei objectForFooClass eine Nicht-Null-Instanz für den Klassentyp Foo ist.
quelle
GetInstanceField(typeof(YourClass), instance, "someString") as string
Wie erhalte ich den Wert eines privaten Feldes in C #?Eine Sache, die Sie beachten müssen, wenn Sie über private Mitglieder nachdenken, ist, dass Ihre Anwendung, wenn sie in mittlerer Vertrauenswürdigkeit ausgeführt wird (z. B. wenn Sie in einer gemeinsam genutzten Hosting-Umgebung ausgeführt werden), diese nicht findet - die Die Option BindingFlags.NonPublic wird einfach ignoriert.
quelle
quelle
Schöne Syntax mit Erweiterungsmethode
Sie können mit folgendem Code auf jedes private Feld eines beliebigen Typs zugreifen:
Dazu müssen Sie eine Erweiterungsmethode definieren, die die Arbeit für Sie erledigt:
quelle
Ich benutze diese Methode persönlich
quelle
Hier sind einige Erweiterungsmethoden zum einfachen Abrufen und Festlegen privater Felder und Eigenschaften (Eigenschaften mit Setter):
Anwendungsbeispiel:
Code:
quelle
Ja, Sie müssen jedoch Ihre Bindungsflags setzen, um nach privaten Feldern zu suchen (wenn Sie nach dem Mitglied außerhalb der Klasseninstanz suchen).
Das Bindungsflag, das Sie benötigen, lautet: System.Reflection.BindingFlags.NonPublic
quelle
Ich bin darauf gestoßen, als ich auf Google danach gesucht habe, und habe festgestellt, dass ich einen alten Beitrag stoße. Für GetCustomAttributes sind jedoch zwei Parameter erforderlich.
Der zweite Parameter gibt an, ob Sie die Vererbungshierarchie durchsuchen möchten oder nicht
quelle