2010-02-24 8 views
7

J'utilise un Height pour tous les membres Foo s. Comme ceciAccéder à une propriété statique d'une classe générique?

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 même situation se trouve dans VB.NET.

+1

Aargh! Mes yeux! –

+2

Quel est le problème avec vos yeux? – serhio

Répondre

13

Vous devrez mettre un paramètre de type générique là-dedans. Cela étant dit, j'utiliserai parfois une sorte de schéma d'héritage pour obtenir cette fonctionnalité sans avoir à mettre dans le paramètre de type générique.

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

Cela étant dit, cela gardera la même FoosHeight quel que soit le paramètre de type générique passé dans Foo<T>. Si vous voulez une valeur différente pour chaque version de Foo<T>, vous devrez choisir un type à mettre dans ce paramètre de type, et oublier le schéma d'héritage.

+0

Je suppose que la même solution devrait fonctionner dans VB.NET aussi? – serhio

+0

Oui, ça devrait. Même idée générale, réécrivez-la simplement dans VB.NET. Tout convertisseur de code en ligne devrait faire l'affaire. –

2

Chaque générique spécifique est son propre type, et possède donc sa propre variable statique. Donc un Foo<int> aurait un membre de hauteur statique différent d'un Foo<string>. Si vous voulez que ce soit partagé entre tous les types spécifiques, vous devez implémenter cela ailleurs.

Si vous voulez vraiment définir la valeur pour un type Foo<object>, c'est juste que: Foo<object>.

+0

Je suppose que la même situation sera avec le Foo , je veux dire Foo sera différent de Foo serhio

+0

qui est correct. C'est une entité différente dans le système de types. –

7

Vous devez spécifier un type, comme

Foo<int>.FoosHeight = 50; 

ou

Foo<Bar>.FoosHeight = 50; 

mais chacun est séparé. Foo<int>.FoosHeight n'est pas liée à Foo<Bar>.FoosHeight. Ils sont effectivement deux classes distinctes avec deux champs statiques distincts. Si vous voulez que la valeur soit la même pour tous Foo <> alors vous avez besoin d'un endroit séparé pour stocker comme

FooHelper.FoosHeight = 50; 

Et FooHelper n'a pas de relation formelle avec Foo <>.

+0

Très bonne explication. –

Questions connexes