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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top