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.