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?
3 Réponses :
Le fait que cela vous concerne probablement que vous utilisez des constructeurs statiques. P>
Avec cela à l'esprit, vous pouvez créer un constructeur statique dans bus code> qui invoque manuellement le constructeur statique dans
bus code>. Notez qu'il n'est pas possible d'exécuter un constructeur statique plus d'une fois. P>
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é.
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. p>
"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); }} code>. 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.
Le constructeur statique d'un type générique est invoqué exactement une fois par appeler appeler Si vous créez un Fondamentalement si je copierez votre code, créez un argument mannequin L'exemple que vous avez fourni uniquement fonctionne car type code>, lorsque ce type est référencé. p>
bus x = nouveaux bus () code> convoquera le constructeur statique de
Bus
bus
bus
bus code>, réglage
bus.field code>. p>
Bugs de classe: Bus
bugs.field code>, car il va d'abord résoudre le type d'argument
bus Code>, qui invoque le constructeur statique de sa classe de base
bus
bus.field code>. Lorsqu'il essaie d'appeler le constructeur statique de la classe de base code> de bugs code>, il penserait qu'il avait déjà appelé le bus statique
bus
class code> et créez une nouvelle instance de
bus code>, le constructeur statique est utilisé em> invoqué et
bus.field code> est em> défini sur une instance de
argument code>, 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. P>
bus code> est l'argument type pour lui-même. P>
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 i> des données statiques et doit seulement être initialisée une fois, donc des constructeurs statiques.