2010-02-24 160 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