2015-04-27 5 views
2

Я создал имя класса cls1 и создал метод GrantAccess(), но я не могу получить доступ к _entities.it, показав ниже ошибку «Ошибка 1 Ссылка на объект требуется для нестатического поля, метода или свойства« Path._entities ».Ссылка на объект требуется для нестатического поля, метода или свойства

public class cls1 
{ 
    private readonly DBEntities _entities; 

    public cls1() 
    { 
     if (_entities == null) 
     { 
      _entities = new DBEntities(); 
     } 
    } 

    public static void GrantAccess() 
    { 
     if (Settings.DbLog == "1") 
     { 
      _entities.II_CCLog("Excuting the GrantAccess() Method"); 
     } 
    } 
} 

Вышеуказанный метод вызывается в каком-либо другом классе.

public void GetCConfig() 
{ 
cls1.GrantAccess(); 
} 
+0

частных DBEntities _entities только для чтения; изменить на private static readonly DBEntities _entities; –

+1

Привет, Jinesh Jain. Спасибо за ваш комментарий. –

ответ

1

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

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

Или создайте новый экземпляр DBEntities в статическом методе GrantAccess и выполните операцию над этим экземпляром.

public static void GrantAccess() 
{ 
    if (Settings.DbLog == "1") 
    { 
     DBEntities entities = new DBEntities(); 
     entities.II_CCLog("Excuting the GrantAccess() Method"); 
    } 
} 
+0

Привет, Jehof, Спасибо за ответ. –

1

сначала вы должны создать объект cls1 в классе, где вы вызываете метод класса cls1, а затем из этой ссылки на объект вы сможете вызвать метод GrantAccess();. Вы можете создать объект, следующим образом: -

variable_name = new class_name();

+0

Привет Карвин. Спасибо за твоих Ans. –

+0

спасибо, и я надеюсь, что он решает вашу проблему ...- @ Jagadisha –

+0

Да Карвин, ее решает мою проблему по-разному.в любом случае спасибо за ваши ан. –

1

Вы смешиваете статический код с кодом экземпляра. Если вы работаете с объектами, не делают ваш метод GrantAccess статичным:

public void GrantAccess() 
{ 
    if (Settings.DbLog == "1") 
    { 
     _entities.II_CCLog("Excuting the GrantAccess() Method"); 
    } 
} 

Тогда вам придется создать экземпляр cls1:

public void GetCConfig() 
{ 
    var instance = new cls1(); 
    cls1.GrantAccess(); 
} 

Вы также должны сделать cls1 одноразовые и вызовите .Dispose() на _entities после того, как вы закончите использовать его.

public class cls1 : IDisposable 
{ 

...

public void Dispose() 
{ 
    _entities.Dispose(); 
} 

Поместите экземпляр cls1 в блоке с использованием, например:

public void GetCConfig() 
{ 
    using(var instance = new cls1()) 
    { 
     cls1.GrantAccess(); 
    } 
} 

Наконец, следующая строка не нужна, потому что _entities всегда будет null в начале конструктора.

if (_entities == null) 
{ 

Я предлагаю читать некоторую базовую документацию по объектно-ориентированному программированию с C#, например: https://msdn.microsoft.com/en-us/library/dd460654.aspx

+0

Привет, Стенфан, спасибо за твоих Ан. –

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