получить доступ к статическому полю типа в универсальной функции - PullRequest
4 голосов
/ 01 ноября 2010

Я хочу получить доступ к статическим полям типа, который является классом, представленным в универсальной функции.Но компилятор всегда выдает мне эту ошибку

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

Я подозреваю, что это как-то связано с тем, что интерфейсы обычно используются для фильтрации имени типа в универсальной функции.или так должно быть всегда?В этом случае не должно быть статического поля.Есть ли способ, которым я могу достичь?

Ответы [ 3 ]

1 голос
/ 01 ноября 2010

Статические поля принадлежат типу, а не экземпляру типа.Вы не можете ссылаться на статические элементы параметра типа, поскольку они не наследуются.

Сделать 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; }
    }
}
1 голос
/ 01 ноября 2010

То, что вы делаете, неправильно, вы пытаетесь получить доступ к типу, а не к экземпляру.

Итак, как решить эту проблему,

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 для другого варианта.

1 голос
/ 01 ноября 2010

попробуйте это:

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 в производных классах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...