2010-02-24 23 views
7

Uso un Height para todos los miembros de Foo s. Me gusta esto¿Acceder a una propiedad estática de una clase genérica?

public class Foo<T> 
{ 
    public static int FoosHeight; 
} 

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     Foo<???>.FoosHeight = 50; // DO I Set "object" here? 
    } 
} 

La misma situación está en VB.NET.

+1

Aargh! ¡Mis ojos! –

+2

¿Qué pasa con tus ojos? – serhio

Respuesta

13

Tendría que poner algún parámetro de tipo genérico allí. Dicho esto, algunas veces usaré algún tipo de esquema de herencia para obtener esta funcionalidad sin tener que poner el parámetro de tipo genérico.

public class Foo 
{ 
    public static int FoosHeight; 
} 

public class Foo<T> : Foo 
{ 
    // whatever 
} 

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     Foo.FoosHeight = 50; // DO I Set "object" here? 
    } 
} 

Dicho esto, esto mantendrá el mismo FoosHeight independientemente del parámetro de tipo genérico pasado a Foo<T>. Si desea un valor diferente para cada versión de Foo<T>, deberá elegir un tipo para poner ese parámetro de tipo y olvidar el esquema de herencia.

+0

Supongo que la misma solución debería funcionar en VB.NET también? – serhio

+0

Sí, debería. La misma idea general, simplemente reescríbelo en VB.NET. Cualquier convertidor de código en línea debería hacer el truco. –

2

Cada genérico específico es de su propio tipo, y por lo tanto tiene su propia variable estática. Entonces, un Foo<int> tendría un miembro de altura estática diferente de Foo<string>. Si desea que se comparta entre todos los tipos específicos de Foo<T>, debe implementarlo en otro lugar.

Si realmente desea establecer el valor para un tipo Foo<object>, simplemente es eso: Foo<object>.

+0

Supongo que la misma situación será con el Foo , me refiero a Foo será diferente de Foo serhio

+0

que es correcto. Es una entidad diferente en el sistema de tipos. –

7

es necesario especificar un tipo, tales como

Foo<int>.FoosHeight = 50; 

o

Foo<Bar>.FoosHeight = 50; 

pero cada uno es independiente. Foo<int>.FoosHeight no está relacionado con Foo<Bar>.FoosHeight. En realidad, son dos clases separadas con dos campos estáticos distintos. Si desea que el valor sea el mismo para todos los Foo <> entonces usted necesita un lugar separado para almacenarla como

FooHelper.FoosHeight = 50; 

Y FooHelper tiene ninguna relación formal con Foo <>.

+0

Muy buena explicación. –

Cuestiones relacionadas