6
votes

C # Constructeur statique non appelé de la classe dérivée

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;
}
Any ideas how to make this work so that a reference to the static field in Buss triggers the static constructor in Bus?

2 commentaires

Pourquoi le constructeur statique? Un constructeur statique est utilisé pour initialiser toutes les données statiques ou pour effectuer une action particulière à effectuer une fois uniquement.


«Champ ' est des données statiques et doit seulement être initialisée une fois, donc des constructeurs statiques.


3 Réponses :


3
votes

Le fait que cela vous concerne probablement que vous utilisez des constructeurs statiques.

Avec cela à l'esprit, vous pouvez créer un constructeur statique dans bus 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.


5 commentaires

Le constructeur statique ne peut pas être appelé directement.


Je me rends compte par «faux» que vous voulez probablement que mon oop est désactivé. Cependant, je pense que pour pouvoir hériter des membres statiques (y compris des constructeurs statiques) serait effectivement plus orienté objet.


@AdT: il suffit de faire référence à n'importe quel champ ou méthode statique, et il sera appelé implicitement.


Pouvez-vous directement appeler le constructeur statique?


@AdT: Pas explicitement, mais l'appelant peut être accompli, comme je l'ai mentionné.



1
votes

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.


1 commentaires

"Les champs statiques qui ne sont pas hérités": j'ai dans mon code (bouilli vers le bas) classe T1 {String statique publique S1 = "S1"; } Classe T2: T1 {VOID F () {CONSOLE.WRITINE (S1); }} . Est-ce que cela ne compte pas comme héritage? On pourrait légitimement s'attendre à ce que le constructeur statique d'une classe de base soit exécuté avant que le constructeur statique de l'une de ses subcclasses soit exécuté, car il peut également effectuer des initialisations statiques nécessaires à la classe dérivée.



2
votes

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

appeler bus x = nouveaux bus () convoquera le constructeur statique de Bus . .

appeler bus x = nouveau bus () invoquera également le constructeur statique de bus , mais il le fera Type d'argument bus , réglage bus.field .

Si vous créez un Bugs de classe: Bus Il ne définira jamais bugs.field , car il va d'abord résoudre le type d'argument bus , qui invoque le constructeur statique de sa classe de base bus , paramètre bus.field . Lorsqu'il essaie d'appeler le constructeur statique de la classe de base de bugs , il penserait qu'il avait déjà appelé le bus statique bus constructeur et sautez-le.

Fondamentalement si je copierez votre code, créez un argument mannequin class et créez une nouvelle instance de bus , le constructeur statique est utilisé invoqué et bus.field est défini sur une instance de argument , mais je reconnais un comportement étrange ici dans lequel je devrais vous conseiller utiliser la réflexion d'une méthode statique pour atteindre la statique des sous-classes.

L'exemple que vous avez fourni uniquement fonctionne car bus est l'argument type pour lui-même.


0 commentaires