Frage

Ich habe ein Problem mit Reflexion. Ich brauche die Art zu finden, die ein statisches Element instanziiert. Mein Code sieht wie folgt aus:

    private class SimpleTemplate : PageTemplate
    {
        internal static readonly IPageProperty NameProperty =
            PropertyRepository.Register("Name");
    }

Die PropertyRepository ist ein Repository von Eigenschaften (offensichtlich). Es hält den Überblick über alle Eigenschaften, die den Typ System registriert wurden, verwenden, die ich baue.

Damit erfolgreich zu tun, muß ich den Überblick über alle Eigenschaften halten, sondern auch die Art, auf die sie definiert sind. Andernfalls, wenn zwei Objekte mit dem gleichen Namen definiert werden, wird die Objekt-Repository nicht in der Lage sein, sie auseinander zu halten.

Also, was ich tun möchte, ist die Art, um herauszufinden, dass die NameProperty und speichern Sie die Art sowie den Namen definiert. Wie kann ich das tun?

Ich möchte starke Typisierung verwenden, das heißt ich will nicht den Typ als Argument an PropertyRepository.Register senden. Das wäre fehleranfällig, da ich nicht bestätigen kann, dass die Art Argument korrekt ist.

Die Lösung, stelle ich mir vor, würde bedeuten, Reflexion. Gibt es eine Möglichkeit Reflexion zu verwenden, um zu bestimmen, welche Art eine statische Methode aufruft? Die statischen Eigenschaften werden implizit instanziiert einen statischen Konstruktor (dass der Compiler erzeugt). Gibt es eine Möglichkeit für mich, einen Griff an diesen Konstruktor zu bekommen? Das scheint machbar, ich kann einfach nicht herausfinden, wie das zu tun.

Mit anderen Worten: Wenn Methode A Methode B aufruft, gibt es eine Möglichkeit B kann sagen, dass es von einer mit Reflexion genannt wurde? Ich stelle mir vor es ist, aber ich kann nicht herausfinden, wie.

Wer weiß?

Edit:. Ich habe an der StackFrame- Klasse sehe und während es zu tun scheint, was ich will, kann es nicht in Produktionscode zuverlässig sein (und ich brauche das)

War es hilfreich?

Lösung

Dies ist fast ein Duplikat diese Frage , aber nicht ganz . Schauen Sie sich, dass die eigenen Antworten though.

Ich persönlich denke, ich in der Art passieren würde. Eine Alternative wäre, ein Attribut zu verwenden, z.

[PropertyName("Name")]
private static readonly IPageProperty NameProperty = null;

static
{
    PropertyRepository.RegisterProperties(typeof(SimpleTemplate));
}

PropertyRepostiory.RegisterProperties könnte dann den Wert des Nur-Lese-Feldes gesetzt Reflexion (falls dies funktioniert - ich habe es nicht versucht, die Nur-Lese-ness könnte erzwungen werden). Es ist ein bisschen obwohl eklig ... Alternativ können Sie nur die Eigenschaft aus dem Repository erhalten, wenn Sie es brauchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top