c # construtor estático não chamado de classe derivada
-
29-10-2019 - |
Pergunta
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;
}
Alguma idéia de como fazer isso funcionar para que uma referência ao campo estático no Buss acione o construtor estático no Bus?
Solução
O fato de que isso é importante para você provavelmente significa que você está usando construtores estáticos incorretos.
Com isso em mente, você poderia fazer um construtor estático em Buss
que invoca manualmente o construtor estático em Bus
.Observe que não é possível executar um construtor estático mais de uma vez.
Outras dicas
MSDN diz que 'Os construtores estáticos não são herdados '.Eu acho que isso é semelhante a campos estáticos que também não são herdados.
O construtor estático de um tipo genérico é invocado exatamente uma vez por Type
, quando esse tipo é referenciado.
Chamar Buss x = new Buss()
invocará o construtor estático de Bus<Buss>
.
Chamar Bus<Buss> x = new Bus<Buss>()
também invocará o construtor estático de Bus<Buss>
, mas fará isso para seu argumento de tipo Buss
, definindo Buss.field
.
Se você criar um class Bugs : Bus<Buss>
, ele nunca definirá Bugs.field
, pois primeiro resolverá o argumento de tipo Buss
, que invoca o construtor estático de sua classe base Bus<Buss>
, definindo Buss.field
. Quando ele tentar chamar o construtor estático da classe base Bugs
, ele pensará que já invocou o construtor estático Bus<Buss>
e o ignorará.
Basicamente, se eu copiar e colar seu código, criar uma classe fictícia Argument
e criar uma nova instância de Buss
, o construtor estático é invocado e Buss.field
é definido como uma instância de Argument
, mas reconheço algum comportamento estranho aqui, no qual eu teria que aconselhar não usar reflexão de um método estático para alcançar a estática das subclasses.
O exemplo que você forneceu só funciona porque Buss
é o próprio argumento de tipo.