Pregunta

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;
}

¿Alguna idea de cómo hacer que esto funcione para que una referencia al campo estático en Buss active el constructor estático en Bus?

¿Fue útil?

Solución

El hecho de que esto te importe probablemente signifique que estás usando constructores estáticos incorrectamente.

Con eso en mente, podría crear un constructor estático en Buss que invoque manualmente el constructor estático en Bus.Tenga en cuenta que no es posible ejecutar un constructor estático más de una vez.

Otros consejos

MSDN dice que 'Los constructores estáticos no se heredan '.Supongo que esto es similar a los campos estáticos que tampoco se heredan.

El constructor estático de un tipo genérico se invoca exactamente una vez por Type, cuando se hace referencia a ese tipo.

Vocación Buss x = new Buss() invocará el constructor estático de Bus<Buss>.

Vocación Bus<Buss> x = new Bus<Buss>() también invocará el constructor estático de Bus<Buss>, pero lo hará por su argumento de tipo Buss, configuración Buss.field.

Si creas un class Bugs : Bus<Buss> nunca se pondrá Bugs.field, ya que primero resolverá el argumento de tipo Buss, que invoca al constructor estático de su clase base Bus<Buss>, configuración Buss.field.Cuando intenta llamar al constructor estático de Bugs clase base, pensará que ya había invocado la función estática Bus<Buss> constructor y omitirlo.

Básicamente, si copio y pego tu código, creo un muñeco. Argument clase y crear una nueva instancia de Buss, el constructor estático es invocado y Buss.field es establecido en una instancia de Argument, pero reconozco un comportamiento extraño aquí en el que tendría que recomendar no utilizar la reflexión de un método estático para alcanzar la estática de las subclases.

El ejemplo que proporcionaste solo funciona porque Buss es el argumento de tipo por sí mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top