2010-11-01 3 views
4

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

«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 в обобщенной функции. или это должно быть всегда? В этом случае не должно быть статического поля. Есть ли способ, которым я могу достичь?

ответ

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

+0

ОК, но как насчет без ввода ввода в качестве параметра? –

+0

Для получения своих свойств необходимо иметь экземпляр типа. –

1

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

Сделать 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; } 
    } 
} 
+0

, но я не хочу передавать экземпляр. Я думал, что общие функции - это способ передать тип в качестве параметра, не так ли? –

+0

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

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 

      } 
     } 

wait, вы тоже не можете этого сделать. Потому что вы не можете использовать статические экземпляры как общие ограничения, потому что статические данные опечатываются сами.

Итак, как получить доступ к Num, изменить экземпляр Num на объект или передать ответ Preets для другого параметра.

Смежные вопросы