访问泛型函数中typename的静态字段

时间:2010-11-01 09:24:08

标签: c# static generics

我想访问一个类型的静态字段,这是一个类,在泛型函数中引入。但编译器总是给我这个错误

  

'T'是'类型参数',即   在给定的上下文中无效

这是代码。

 public class A
  {
    public static int Num = 1;
    public int GetClassNum<T>() where T : A
    {
      //return T.Num;
      //return default(T).Num;
      //return what???
    }
  }

  public class B : A
  {
    public static int Num = 2;
  }

  public class C : A
  {
    public static int Num = 3;
  }

我怀疑这与接口通常用于过滤泛型函数中的typename这一事实有关。还是一定要总是?在这种情况下,不应该有静态字段。我有什么方法可以实现吗?

3 个答案:

答案 0 :(得分:1)

试试这个:

public class A
  {
    private static int _num = 1;
    public  virtual int Num { get { return _num; } set { _num = value; } }
    public int GetClassNum<T>(T input) where T : A
    {
      return input.Num;
    }
  }

然后在派生类中重写Num

答案 1 :(得分:1)

静态字段属于类型,而不属于该类型的实例。您不能引用type参数的静态元素,因为它们不是继承的。

使Num不是静态属性:

public class A
{
    public virtual int Num
    {
        get { return 1; }
    }

    public int GetClassNum<T>(T instance) where T : A
    {
        return instance.Num;
    }
}

public class B : A
{
    public override int Num
    {
        get { return 2; }
    }
}

public class C : A
{
    public override int Num
    {
        get { return 3; }
    }
}

答案 2 :(得分:1)

您正在做的是错误的,您正在尝试访问类型,而不是实例。

那么如何解决这个问题,

public  class A
    {
        public static int Num = 1;
        public int GetClassNum<T>(T inn) where T : A  
        {
            inn.Num //really

        }
    }
等等,等等......你也不能这样做。因为Num是静态的,我们传递的东西(T inn)是一个对象引用(只有一个类可以访问静态字段,而不是对象)。然后我们怎样才能使这个工作。一种方法是将T作为静态类型,所以

 public static class A
        {
            public static int Num = 1;
            public int GetClassNum<T>(T inn) where T : A  // Error here
            {
                inn. /// no Num

            }
        }
等等,你也不能这样做。因为你不能使用静态实例作为通用约束,因为静态是自己封闭的。

那么如何访问Num,将Num更改为对象实例或参考Preets answer for other option。