Question

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

Des idées comment faire ce travail afin qu'une référence au champ statique dans les bus déclenche le constructeur statique dans le bus?

Était-ce utile?

La solution

Le fait que cela vous importe signifie probablement que vous utilisez des constructeurs statiques erronés.

Dans cet esprit, vous pouvez faire un constructeur statique dans Buss qui invoque manuellement le constructeur statique dans Bus. Notez qu'il n'est pas possible d'exécuter un constructeur statique plus d'une fois.

Autres conseils

MSDN dit que «les constructeurs statiques ne sont pas hérités». Je suppose que cela est similaire aux champs statiques qui ne sont pas hérités non plus.

Le constructeur statique d'un type générique est invoqué exactement une fois par Type, lorsque ce type est référencé.

Appel Buss x = new Buss() invoquera le constructeur statique de Bus<Buss>.

Appel Bus<Buss> x = new Bus<Buss>() invoquera également le constructeur statique de Bus<Buss>, mais il le fera pour son argument de type Buss, paramètre Buss.field.

Si vous créez un class Bugs : Bus<Buss> il ne définira jamais Bugs.field, car il résoudra d'abord l'argument de type Buss, qui invoque le constructeur statique de sa classe de base Bus<Buss>, paramètre Buss.field. Quand il essaie d'appeler le constructeur statique de Bugs classe de base, il pensera qu'il avait déjà invoqué la statique Bus<Buss> Constructeur et sautez-le.

Fondamentalement, si je copie coller votre code, créez un mannequin Argument classe et créez une nouvelle instance de Buss, le constructeur statique est invoqué et Buss.field est réglé sur une instance de Argument, mais je reconnais ici un comportement étrange dans lequel je devrais conseiller de ne pas utiliser la réflexion à partir d'une méthode statique pour atteindre la statistique des sous-classes.

L'exemple que vous avez fourni ne fonctionne que parce que Buss est l'argument type pour lui-même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top