2016-09-12 2 views
0

У меня есть два класса. Один из них:Вызов статического метода внутреннего класса с объектом внешнего класса

namespace DataStructures_Algorithms 
{ 
    public class BackendService 
    { 

     public class LocationServiceQueue 
     { 
      private static string deviceId; 
      private static POI currentPOI; 
      private static DateTime timeStamp; 
      private static ConcurrentQueue<DeviceMessage> concurrentQueue = new ConcurrentQueue<DeviceMessage>(); 

      public static void Enqueue(DeviceMessage deviceMessage) 
      { 
       try 
       { 
        concurrentQueue.Enqueue(deviceMessage); 

       } 
       catch (Exception ex) 
       { 
        Console.WriteLine("Exception Occured in LocationServiceQueue Class " + ex.ToString()); 
       } 
      } 

     } 
} 

, и теперь я хочу вызвать метод enqueue класса LocationServiceQueue.

   backendService.LocationServiceQueue.Enqueue(new DeviceMessage 
       { 
        DeviceId = deviceID, 
        CurrentPOI = currentPOI, 
        Timestamp = DateTime.Now 
       }); 

это сообщение об ошибке, к которому у вас нет доступа. Как я могу получить доступ?

+0

Не могли бы вы показать больше, как вы его называете? Например, вы сначала создали экземпляр класса? –

+0

Я сначала создаю экземпляр объекта backedService. 'BackendService backendService = new BackendService();'. но теперь я застрял, как вызвать этот статический метод внутреннего класса этого объекта backendService –

+0

Если нижеприведенный ответ не работает для вас (это кажется правильным, хотя), я увидел один из ответов в Интернете, они предлагают пройти внешний класс как параметр для внутреннего. Возможно, это может помочь: [Могу ли я получить доступ к внешним объектам класса во внутреннем классе] (http://stackoverflow.com/questions/2957900/can-i-access-outer-class-objects-in-inner-class) –

ответ

1

Enqueue - метод класса, поэтому вам необходимо получить доступ к методу с использованием имени класса (, а не с использованием переменной экземпляра).

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

BackendService.LocationServiceQueue.Enqueue(new DeviceMessage 
      { 
       DeviceId = deviceID, 
       CurrentPOI = currentPOI, 
       Timestamp = DateTime.Now 
      }); 
+0

есть ли способ доступа к внутреннему классу «LocationServiceQueue» объектом классов «BackendService»? –

+0

Нет, невозможно. Если вы хотите сделать его специфичным для экземпляра, сделайте свой метод «Enqueue» не статическим и создайте свойство/поле для класса «LocationServiceQueue» внутри вашего «BackendService». –

+1

Чтобы понять, что я имею в виду, проверьте этот [пример] (https://dotnetfiddle.net/G83pqe) –

1

Я разместил ссылку в комментариях, но ответ был бы легче помочь вам. Измените код следующим образом:

namespace DataStructures_Algorithms 
{ 
    public class BackendService 
    { 
     public class LocationServiceQueue 
     { 
      private BackendService _backendservice; 

      private static string deviceId; 
      private static POI currentPOI; 
      private static DateTime timeStamp; 
      private static ConcurrentQueue<DeviceMessage> concurrentQueue = new ConcurrentQueue<DeviceMessage>(); 

      public LocationServiceQueue(BackendService outer) 
      { 
       _backendservice = outer; 
      } 


      public static void Enqueue(DeviceMessage deviceMessage) 
      { 
       try 
       { 
        concurrentQueue.Enqueue(deviceMessage); 

       } 
       catch (Exception ex) 
       { 
        Console.WriteLine("Exception Occured in LocationServiceQueue Class " + ex.ToString()); 
       } 
      } 

     } 
} 

И позже:

BackendService.LocationServiceQueue l = new BackendService.LocationServiceQueue(new BackendService()); 

Хотя это работает только, если вы на самом деле не заботиться о своем классе BackendService, но только о методах LocationServiceQueue.

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