访问泛型类的静态属性?

7

我使用Height为所有Foo的成员指定高度。如下所示:

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中。

2
你的眼睛有什么问题? - serhio
3个回答

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>版本有不同的值,则必须选择一种类型放入该类型参数中,并忘记继承方案。


是的,应该可以。相同的基本思路,只需用VB.NET重写即可。任何在线代码转换器都可以解决问题。 - David Morton

7

您需要指定一个类型,例如

Foo<int>.FoosHeight = 50;

或者

Foo<Bar>.FoosHeight = 50;

但是它们是分开的。 Foo<int>.FoosHeightFoo<Bar>.FoosHeight 没有关系。它们实际上是两个不同的类,具有两个不同的静态字段。如果你想要所有的 Foo<> 的值都相同,那么你需要一个单独的地方来存储它,比如:

FooHelper.FoosHeight = 50;

而FooHelper与Foo<>没有正式的关系。


2
每个具体的泛型都是它自己的类型,因此有它自己的静态变量。所以,Foo<int>将有一个不同于Foo<string>的静态高度成员。如果您希望在所有特定的Foo<T>类型之间共享该变量,则需要在其他地方实现。如果您只想为Foo<object>类型设置值,那么就直接使用Foo<object>即可。

我想Foo<object>也会出现同样的情况,我的意思是Foo<object>和Foo<string>会有所不同。 - serhio
这是正确的。在类型系统中,它是一个不同的实体。 - Joel Coehoorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接