2016-09-12 16 views
0

私は2つのクラスを持っています。 1つはこれです:外部クラスのオブジェクトを持つ内部クラスの静的メソッドを呼び出す

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()); 
       } 
      } 

     } 
} 

ここで私はLocationServiceQueueクラスのエンキューメソッドを呼び出したいと思います。

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

これは、アクセスできないというエラーを示します。どうすればアクセスできますか?

+0

あなたはそれをどのように呼んでいるかをさらに表示できますか?たとえば、最初にクラスを適切にインスタンス化しましたか? –

+0

私はまず、backupServiceオブジェクトをインスタンス化します。 'BackendService backendService =新しいBackendService();'しかし、今私は、そのbackendServiceオブジェクトの内部クラスの静的メソッドを呼び出す方法がついていません –

+0

以下の答えがあなたのために働かない場合(それは正しいように見えます)、私は答えをオンラインで見た、内部クラスへのパラメータとしてのクラス。おそらく、これは助けることができます:[内部クラスの外部クラスオブジェクトにアクセスできますか?](http://stackoverflow.com/questions/2957900/can-i-access-outer-class-objects-in-inner-class) –

答えて

1

Enqueueはクラスメソッドであるため、クラス名(ではなくインスタンス変数を使用)を使用してメソッドにアクセスする必要があります。

内部のLocationServiceQueueクラスはpublicクラスなので、これを行うことができます。

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

'BackendService'クラスのオブジェクトによって内側の' LocationServiceQueue'クラスにアクセスする方法はありますか? –

+0

いいえ、不可能です。インスタンス固有のものにするには、 'Enqueue'メソッドを静的でなく、' BackendService'の中に 'LocationServiceQueue'クラスのためのプロパティ/フィールドを作成してください。 –

+1

私が何を意味しているかを理解するには、この[例](https://dotnetfiddle.net/G83pqe) –

1

私はコメントにリンクを掲載しましたが、回答がより簡単になります。あなたが本当にあなたのBackendServiceクラスを気にしますが、唯一のLocationServiceQueue方法についてはしていない場合は、こののみ動作しますが

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

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()); 
       } 
      } 

     } 
} 

以降: はこれにあなたのコードを変更します。

関連する問題