2010-02-24 208 views
7

我對所有Foo的成員使用Height。像這樣訪問泛型類的靜態屬性?

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

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

同樣的情況是在VB.NET中。

+1

唉!我的眼睛! – 2010-02-24 14:52:47

+2

你的眼睛有什麼問題? – serhio 2010-02-24 14:58:15

回答

13

你必須在其中放置一些泛型類型參數。話雖如此,我有時會使用某種繼承方案來獲得此功能,而無需放入泛型類型參數。

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

話雖這麼說,這將保持相同的FoosHeight無論傳遞到Foo<T>泛型類型的參數。如果你想爲每個版本的Foo<T>設置一個不同的值,你必須選擇一個類型來放入該類型參數,並忘記繼承方案。

+0

我想,同樣的解決方案也應該在VB.NET中工作? – serhio 2010-02-24 14:59:32

+0

是的,它應該。相同的概念,只需在VB.NET中重寫它。任何在線代碼轉換器都應該這樣做。 – 2010-02-24 15:03:14

2

每個特定的泛型是它自己的類型,因此它有自己的靜態變量。所以Foo<int>將有一個不同的靜態高度成員比Foo<string>。如果您想要在所有特定的Foo<T>類型之間共享,則需要在其他位置實施。

如果你真的只想設置一個Foo<object>類型的值,那麼它只是:Foo<object>

+0

我想同樣的情況會用Foo ,我的意思是Foo 會和Foo serhio 2010-02-24 15:01:03

+0

不一樣。這是類型系統中的另一個實體。 – 2010-02-24 15:56:42

7

需要指定一個類型,如

Foo<int>.FoosHeight = 50; 

Foo<Bar>.FoosHeight = 50; 

但每個是分開的。 Foo<int>.FoosHeightFoo<Bar>.FoosHeight無關。它們實際上是兩個獨立的類,有兩個不同的靜態字段。如果你想要的值是相同的所有富<>那麼你需要一個單獨的地方,將其存儲像

FooHelper.FoosHeight = 50; 

而且FooHelper與富<沒有正式關係>。

+0

非常好的解釋。 – 2010-02-24 14:55:07