【问题标题】:access a static field of a typename in generic function在泛型函数中访问类型名的静态字段
【发布时间】:2010-11-01 09:24:07
【问题描述】:

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

'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;
  }

我怀疑这与接口通常用于过滤泛型函数中的类型名这一事实有关。还是必须一直如此?在这种情况下,不应该有静态字段。有什么办法可以实现吗?

【问题讨论】:

    标签: c# static generics


    【解决方案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

    【讨论】:

    • 您需要拥有该类型的实例才能获取其属性。
    【解决方案2】:

    你做错了,你试图访问一个类型,而不是一个实例。

    那么如何解决这个问题,

    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 答案以获取其他选项。

    【讨论】:

      【解决方案3】:

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

      使 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; }
          }
      }
      

      【讨论】:

      • 但我不想传递实例。我认为泛型函数是将类型作为参数传递的方式,对吧?
      • 您可以将类型作为参数传递,但您不能访问类型的静态元素,因为它们属于该类型并且不会被继承。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 2011-08-19
      • 2012-03-27
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多