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

C# 访问泛型函数中typename的静态字段,c#,static,generics,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???

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

“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;
  }
公共A类
{
公共静态int Num=1;
public int GetClassNum(),其中T:A
{
//返回T.Num;
//返回默认值(T).Num;
//还什么???
}
}
B级:A级
{
公共静态int Num=2;
}
公共C类:A
{
公共静态int Num=3;
}
我怀疑这与接口通常用于过滤泛型函数中的类型名这一事实有关。还是必须永远如此?在这种情况下,不应存在静态字段。有什么办法可以实现吗?

试试这个:

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;
    }
  }
公共A类
{
私有静态int_num=1;
公共虚拟int Num{get{return}Num;}set{{u Num=value;}}
public int GetClassNum(T输入),其中T:A
{
返回input.Num;
}
}

然后重写派生类中属于类型的静态字段中的Num,而不是该类型的实例。不能引用类型参数的静态元素,因为它们不是继承的

使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; }
    }
}
公共A类
{
公共虚拟整数
{
获取{return 1;}
}
public int GetClassNum(T实例),其中T:A
{
返回instance.Num;
}
}
B级:A级
{
公共覆盖整数
{
获取{return 2;}
}
}
公共C类:A
{
公共覆盖整数
{
获取{return 3;}
}
}

您所做的是错误的,您试图访问的是类型,而不是实例

那么如何解决这个问题呢,

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

        }
    }
公共A类
{
公共静态int Num=1;
公共int GetClassNum(T inn)其中T:A
{
真的吗
}
}
等等,等等。。。你也不能这么做。因为Num是静态的,而我们所传递的(tinn)是一个对象引用(只有类可以访问静态字段,而不是对象)。那么我们如何才能做到这一点呢。一种方法是将T设为静态类型,因此

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

            }
        }
公共静态A类
{
公共静态int Num=1;
public int GetClassNum(T inn),其中T:A//此处有错误
{
客栈///没有
}
}
等等,你也不能这么做。因为静态实例本身是密封的,所以不能将静态实例用作泛型约束


因此,如何访问Num,将Num更改为object instance,或引用Preets answer以获取其他选项。

您需要该类型的实例才能获取其属性。但我不想传递实例。我认为泛型函数是将类型作为参数传递的方式,对吗?您可以将类型作为参数传递,但是您不能访问类型的静态元素,因为它们属于该类型,并且不被继承。