Domanda

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;
}

Qualche idea su come far funzionare questo in modo che un riferimento al campo statico in Buss attivi il costruttore statico in Bus?

È stato utile?

Soluzione

Il fatto che questo sia importante per te probabilmente significa che stai usando i costruttori statici in modo sbagliato.

Con questo in mente, potresti creare un costruttore statico in Buss che richiami manualmente il costruttore statico in Bus.Tieni presente che non è possibile eseguire un costruttore statico più di una volta.

Altri suggerimenti

MSDN dice che "I costruttori statici non vengono ereditati '.Immagino che questo sia simile ai campi statici che non vengono ereditati.

Il costruttore statico di un tipo generico viene invocato esattamente una volta per Type, quando si fa riferimento a quel tipo.

La chiamata a Buss x = new Buss() richiamerà il costruttore statico di Bus<Buss>.

La chiamata a Bus<Buss> x = new Bus<Buss>() richiamerà anche il costruttore statico di Bus<Buss>, ma lo farà per il suo argomento di tipo Buss, impostando Buss.field.

Se crei un class Bugs : Bus<Buss>, non imposterà mai Bugs.field, poiché risolverà prima l'argomento di tipo Buss, che richiama il costruttore statico della sua classe base Bus<Buss>, impostando Buss.field. Quando prova a chiamare il costruttore statico della classe base Bugs, penserà di aver già invocato il costruttore statico Bus<Buss> e lo salterà.

Fondamentalmente se copio e incollo il tuo codice, creo una classe Argument fittizia e creo una nuova istanza di Buss, il costruttore statico viene invocato e Buss.field è impostato su un'istanza di Argument, ma riconosco alcuni strani comportamenti qui in cui dovrei consigliare di non utilizzare la riflessione da un metodo statico per raggiungere la statica delle sottoclassi.

L'esempio che hai fornito funziona solo perché Buss è l'argomento del tipo per se stesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top