2010-02-24 22 views
7

Uso un Height per tutti i membri di Foo. In questo modoAccedere a una proprietà statica di una classe generica?

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 stessa situazione è in VB.NET.

+1

Aargh! I miei occhi! –

+2

cosa c'è di sbagliato nei tuoi occhi? – serhio

risposta

13

Dovresti inserire alcuni parametri di tipo generico. Detto questo, a volte userò qualche tipo di schema di ereditarietà per ottenere questa funzionalità senza dover inserire il parametro di tipo generico.

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

Detto, così si mantiene la stessa FoosHeight indipendentemente dal parametro di tipo generico passato in Foo<T>. Se desideri un valore diverso per ciascuna versione di Foo<T>, dovrai selezionare un tipo per inserire quel parametro di tipo e dimenticare lo schema di ereditarietà.

+0

Suppongo che la stessa soluzione dovrebbe funzionare anche in VB.NET? – serhio

+0

Sì, dovrebbe. La stessa idea generale, basta riscriverla in VB.NET. Qualsiasi convertitore di codice online dovrebbe fare il trucco. –

2

Ogni specifico generico è di tipo proprio e pertanto ha una propria variabile statica. Quindi un Foo<int> avrebbe un membro di altezza statica diverso da uno Foo<string>. Se vuoi che sia condiviso tra tutti i tipi specifici Foo<T>, devi implementarlo da qualche altra parte.

Se si desidera semplicemente impostare il valore per un tipo Foo<object>, piuttosto che: Foo<object>.

+0

Suppongo che la stessa situazione sarà con il Foo , voglio dire Foo sarà diverso da Foo serhio

+0

che è corretto. È un'entità diversa nel sistema di tipi. –

7

è necessario specificare un tipo, come ad esempio

Foo<int>.FoosHeight = 50; 

o

Foo<Bar>.FoosHeight = 50; 

ma ciascuno è separato. Foo<int>.FoosHeight non è correlato a Foo<Bar>.FoosHeight. Sono effettivamente due classi separate con due distinti campi statici. Se si desidera che il valore sia lo stesso per tutti i Foo <> allora avete bisogno di un posto separato per conservarla come

FooHelper.FoosHeight = 50; 

E FooHelper non ha alcun rapporto formale con Foo <>.

+0

Ottima spiegazione. –

Problemi correlati