访问泛型类的静态属性?

时间:2010-02-24 14:50:13

标签: .net generics

我对所有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也是如此。

3 个答案:

答案 0 :(得分: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?
    }
}

话虽如此,无论传递给Foo<T>的泛型类型参数如何,这都将保持相同的FoosHeight。如果你想为每个Foo<T>版本提供不同的值,你必须选择一个类型来放入那个类型参数,并忘记继承方案。

答案 1 :(得分:7)

您需要指定类型,例如

Foo<int>.FoosHeight = 50;

Foo<Bar>.FoosHeight = 50;

但每个都是分开的。 Foo<int>.FoosHeightFoo<Bar>.FoosHeight无关。它们实际上是两个独立的类,有两个不同的静态字段。如果您希望所有Foo&lt;&gt;的值相同然后你需要一个单独的地方来存储它像

FooHelper.FoosHeight = 50;

FooHelper与Foo&lt;&gt;没有正式关系。

答案 2 :(得分:2)

每个特定的泛型都是它自己的类型,因此它有自己的静态变量。因此,Foo<int>具有与Foo<string>不同的静态高度成员。如果您希望在所有特定Foo<T>类型之间共享,则需要在其他地方实现。

如果你真的只想设置Foo<object>类型的值,那就是:Foo<object>