2016-07-05 6 views
-1

私はすでにこのトピックに回答されているすべての同様の質問を見てきましたが、私は私の正確な問題を解決し、答えを見つけることができませんでした。オブジェクト参照が非静的フィールドのために必要とされる...など

private void Subscribe2Data() 
    { 
     // Define parameters for Subscribe method: 
     //int itemIndex; 

     //initialize the client subscription handle 
     clientSubscriptionHandle = 1; 

     //Paramter to specify if the subscription will be added as active or not 
     bool active = true; 

     // The updateRate parameter is used to tell the server how fast we 
     // would like to see data updates. 
     int updateRate = 1000; 

     // The deadband parameter specifies the minimum deviation needed 
     // to be considered a change of value. 0 is disabled 
     Single deadBand = 0; 

     // The revisedUpdateRate parameter is the actual update rate that the 
     // server will be using. 
     int revisedUpdateRate; 


     //Initialize the item identifier values 
     itemIdentifiers[0] = new ItemIdentifier(); 
     itemIdentifiers[0].ClientHandle = 0; 
     itemIdentifiers[0].DataType = Type.GetType("System.int16"); 
     itemIdentifiers[0].ItemName = "Channel1.Device1.Data1"; 


     itemIdentifiers[1] = new ItemIdentifier(); 
     itemIdentifiers[1].ClientHandle = 1; 
     itemIdentifiers[1].DataType = Type.GetType("System.int16"); 
     itemIdentifiers[1].ItemName = "Channel1.Device1.Data2"; 


     itemValues[0] = new ItemValue(); 
     itemValues[0].Value = temp; 

     ReturnCode returnCode; 
     try 
     { 
      returnCode = DaServerMgt.WriteAsync(clientSubscriptionHandle, ref itemIdentifiers, itemValues); 
      if (returnCode != ReturnCode.SUCCEEDED) 
      { 
       Console.WriteLine("Write request failed"); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("WriteAsync exception. Reason: ", ex); 
     } 

returnCode = DaServerMgt.WriteAsync..etcと表示されています。私は、エラー "オブジェクト参照は、非静的なフィールド、メソッドまたはプロパティの"その行に必要ですが表示されます。他の同様の質問に対する答えを見て、私は "private void Subscribe2Data()"を "private static void Subscrive2Data()"に変更して、自分のメソッドを静的にしようとしました。ちょうどDaServerMgt.WriteAsyncラインとは対照的に、その方法で私の変数のすべての単一の1を作っ

やってはオブジェクト参照エラーがあります。

だから、私はSubscribe2Data方法の代わりに、それにRETURNCODEリターンコードセクションと完全に別の方法を作ってみましたし、新しいメソッドがstatic作ったが、エラーがまだそこにいました。

私も

ReturnCode returnCode; 
     try 
     { 
      Service1 p = new Service1(); 
      returnCode = p.DaServerMgt.WriteAsync(clientSubscriptionHandle, ref itemIdentifiers, itemValues); 
      if (returnCode != ReturnCode.SUCCEEDED) 
      { 
       Console.WriteLine("Write request failed"); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("WriteAsync exception. Reason: ", ex); 
     } 

EDIT試してみました:修正し、「オブジェクト参照を..」エラーが、今、私はサービス1が含まれていないと言って他のエラーを与えるクラス(私の悪い)を使用していることDaServerMgt..etcのための定義。 誰かが私が間違っていることを知っていますか?

+0

メソッドのインスタンスを初期化することはできません。メソッドのインスタンスを初期化することはできません。 –

+0

このコードはどこにありますか? 'DaServerMgt.WriteAsync' –

+0

プロチップ。 'static'を使わないでください。難しくて速いルールではありませんが、実際には*悪い習慣に陥る可能性があります。 – BradleyDotNET

答えて

0

この問題はDaServerMgt.WriteAsync()が静的​​ではないということですが、あなたはそれがあるようにそれを呼び出すようにしようとしています。 DaServerMgtクラスをインスタンス化し、そのインスタンスに対してWriteAsync()メソッドを呼び出す必要があります。あなたは(new)メソッド、コンストラクタのみをインスタンス化することはできませんので

DaServerMgt server = new DaServerMgt(); 
returnCode = server.WriteAsync(clientSubscriptionHandle, ref itemIdentifiers, itemValues); 

あなたの第二の試みは動作しません。

すべての場合、クラスを静的にする必要はありません。

+3

OPのために注意してください。 "new DaServerMgt"のためにソリューションを検索し、状態が含まれている場合には既にインスタンス化されているものを使用してください。インスタンス化して新しいインスタンスを使用するだけで、それ自体の問題が発生する可能性があります。 – Quantic

+0

+タスクを結果のように使用しますが、静的なもの全体を修正するまで問題はありません –

+0

ありがとうございました!これにより、私は少なくともそれ以上のプログラムをコンパイルすることができるようになります。 –

0

Subscribe2Data()を作成しても、この問題は解決しません。

問題は、クラスDaServerMgtで、機能WriteAsync()は、静的な関数ではないということです。つまり、Subscribe2Data()でこの関数を呼び出すと、DaServerMgtのインスタンスを持つ必要があります。

+0

'SubscribeServerData'がインスタンス化されていない場合や' WriteAsync() 'メソッドが静的になっていない場合、' Subscribe2Data() 'を静的にすることは役に立ちません。 –

+0

@VisualVincentはい、もちろん正しいです。答えを書いているうちに私の一部に混乱があります。編集します。 – Eli

関連する問題