Frage

class Bus<T>
{
    static Bus()
    {
        foreach(FieldInfo fi in typeof(T).GetFields())
        {
            if(fi.FieldType == typeof(Argument))
            {
                fi.SetValue(typeof(T), new Argument("busyname", "busyvalue"));
            }
        }
    }
}
class Buss : Bus<Buss>
{
    public static Argument field;
}

Irgendwelche Ideen, wie dies funktioniert, damit ein Verweis auf das statische Feld in Buss den statischen Konstruktor in Bus auslöst?

War es hilfreich?

Lösung

Die Tatsache, dass dies für Sie wichtig ist, bedeutet wahrscheinlich, dass Sie statische Konstruktoren falsch verwenden.

In diesem Sinne können Sie einen statischen Konstruktor in Buss erstellen, der den statischen Konstruktor in Bus manuell aufruft.Beachten Sie, dass ein statischer Konstruktor nicht mehr als einmal ausgeführt werden kann.

Andere Tipps

MSDN sagt , dass 'Statische Konstruktoren werden nicht vererbt.Ich denke, dies ähnelt statischen Feldern, die auch nicht vererbt werden.

Der statische Konstruktor eines generischen Typs wird genau einmal pro Type aufgerufen, wenn auf diesen Typ verwiesen wird.

Wenn Sie Buss x = new Buss() aufrufen, wird der statische Konstruktor von Bus<Buss> aufgerufen.

Wenn Sie Bus<Buss> x = new Bus<Buss>() aufrufen, wird auch der statische Konstruktor von Bus<Buss> aufgerufen, dies jedoch für das Typargument Buss, wobei Buss.field festgelegt wird.

Wenn Sie einen class Bugs : Bus<Buss> erstellen, wird niemals Bugs.field festgelegt, da zuerst das Typargument Buss aufgelöst wird, das den statischen Konstruktor seiner Basisklasse Bus<Buss> aufruft und Buss.field festlegt. Wenn versucht wird, den statischen Konstruktor der Basisklasse Bugs aufzurufen, wird angenommen, dass der statische Konstruktor Bus<Buss> bereits aufgerufen und übersprungen wurde.

Wenn ich Ihren Code kopiere, einfüge, eine Dummy-Argument-Klasse erstelle und eine neue Instanz von Buss erstelle, wird der statische Konstruktor aufgerufen und der Buss.field auf eine Instanz gesetzt von Argument, aber ich erkenne hier ein seltsames Verhalten, in dem ich raten müsste, keine Reflexion von einer statischen Methode zu verwenden, um die Statik von Unterklassen zu erreichen.

Das von Ihnen angegebene Beispiel funktioniert nur, weil Buss das Typargument für sich selbst ist.

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