2012-05-18 2 views
0

Я получаю сообщение об ошибке «Ссылка на объект требуется для нестатического поля, метода или свойства .... "для вызова функции Refresh:Get/Set error "Ссылка на объект требуется для нестатического поля ...."

// Статус

public static string Status 
    { 
     get 
      { 
       return status; 
      } 
     set 
     { 
      status = value; 
      Refresh(); 
     } 
    } 

    private void Refresh() 
    { 
     lblStatus.Text = Status.ToString(); 
    } 
+0

Ну да, 'Refresh' не статична, поэтому он должен быть вызван экземпляр объекта. –

+0

вы вызываете нестационарный метод из статического ... так что вы получаете ошибку – Pranav

+1

@JonB: Это не исключение, это ошибка времени компиляции - и довольно четкая ... –

ответ

2

Просто сделать Статус собственности нестатической. Очевидно, что вы не разделяете это свойство во всех экземплярах этого класса. Похоже, вы работаете с элементом управления или классом страницы, и вы также пытаетесь вызвать другие методы или свойства экземпляра.

Так что это исправит ошибку компиляции.

public string Status 
.... 
2

можно вызывать только статические функции от статических функций.

Это должно быть как

public static string Status 
{ 
    get 
    { 
     return status; 
    } 
    set 
    { 
     status = value; 
     Refresh(); 
    } 
} 

private static void Refresh() // Change signature of function 
{ 
    lblStatus.Text = Status.ToString(); 
} 

ИЛИ

Сделать свойство Нестатическими

public string Status // Change signature of property 
{ 
    get 
    { 
     return status; 
    } 
    set 
    { 
     status = value; 
     Refresh(); 
    } 
} 

private void Refresh() 
{ 
    lblStatus.Text = Status.ToString(); 
} 
+0

@Cicada: Made 'Refresh Static' –

+0

Когда я меняю функцию на статическую, lblStatus даст мне ту же ошибку. – Alvin

+0

@KelvinFixx: Почему вы хотите сделать свойство static? Это плохая практика. Сделайте свое свойство и функции нестационарным, как мой второй фрагмент (Edit). –

0

Я думаю, что это плохой дизайн, потому что lblStatus является контролем, я думаю, поэтому он не может быть статичным, поэтому Refresh не может быть статичным.

Таким образом, вы не должны вызывать Refresh() в статическом контексте так или иначе ...

+0

Я хочу обновить lblStatus при изменении состояния. – Alvin

+0

Тогда ... вы должны удалить статическое ключевое слово в свойстве Status! –

0

Это плохой дизайн. Вы должны удалить статику из состояния.

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

Вы можете изменять статические поля/свойства только из статических свойств/методов.

Если вы настаиваете на том, что статус должен быть статическим, вам необходимо создать другое статическое свойство/поле и обновить его через это поле. (ЭТО ОЧЕНЬ ОЧЕНЬ ПЛОХО).

Пример: Предполагая, что статус определяется в классе Form1, и там будет только один Form1 Instance

Class Form1 
    { 
     private static Form1 staticInstance = default(Form1); 
     Form1() 
      { 
      staticInstance = this; 
      } 
     public static string Status 
     { 
      get 
      { 
      return status; 
      } 
      set 
      { 
       status = value; 
       Refresh(); 
      } 
     } 

     private static void Refresh() // Change signature of function 
     { 
      if(staticInstance != default(Form1) 
      staticInstance .lblStatus.Text = Status.ToString(); 
     } 

    } 
+0

'(ЭТО ОЧЕНЬ ОЧЕНЬ ПЛОХО).', Можете ли вы предоставить мне некоторые ссылки, в которых говорится, что это плохо? – FosterZ

+0

было ИМХО. Почему -> staticInstance создается, чтобы оставаться статусом как статическим.Нет ничего неправильного в модификации экземпляра статикой, пока он не пойдет по требованию, и надлежащие меры предосторожности были использованы для ухода за синхронностью. – Tilak

+0

Да, точно, coz Я использовал статические свойства для одного из классов профилировщика членства. так что это зависит от требований. я просто хотел понять, что это действительно плохо или что. – FosterZ

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