2016-10-24 18 views
0

MyTimerクラスを構築したいが、パラメータとしてメソッド名を取得できません。それは "静的コンテキストでは非静的メソッド 'TimerCallBack'にアクセスできないと言いますが、メソッドが静的であるのはわかりますが、静的メソッドと非静的メソッドの両方でこのクラスを使用したいと思います。タイマーテストクラスのオブジェクトが、私はMyTimerに与えると、タイマーオブジェクトでは、このパラメータを使用しようとすると、それがどのように私はこの問題を解決することができます。動作していないのですか?メソッドとしてパラメータを使用する方法(TimerCallback)

class MyTimer 
{ 
    private System.Threading.Timer _timer; 
    private int _period; 
    private int _dueTime; 

    public MyTimer(TimerCallback timerCallBack, int period = System.Threading.Timeout.Infinite, 
     int dueTime = System.Threading.Timeout.Infinite, object _state = null) 
    { 
     this._period = period; 
     this._dueTime = dueTime; 
     _timer = new System.Threading.Timer(timerCallBack, _state, dueTime, period); 
    } 

    public void Start(int period = 0) 
    { 
     if (_timer != null) 
     { 
      if (period != 0) 
      { 
       _period = period; 
      } 
      _timer.Change(_dueTime, _period); 
     } 
    } 

    public void Stop() 
    { 
     _timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); 
    } 

    public void Change(int dueTime, int period) 
    { 
     if (dueTime!= System.Threading.Timeout.Infinite) 
     { 
      _dueTime = dueTime; 
     } 
     if (period != System.Threading.Timeout.Infinite) 
     { 
      _period = period; 
     } 
     _timer.Change(_dueTime, _period); 
    } 

    public void Period(int period) 
    { 
     if (period >= 0) 
     { 
      _period = period; 
     } 
    } 

    public void DueTime(int dueTime) 
    { 
     if (dueTime >= 0) 
     { 
      _dueTime = dueTime; 
     } 
    } 

    public void Dispose() 
    { 
     _timer = null; 
    } 
} 

class test 
{ 
    private MyTimer _timer = new MyTimer(TimerCallBack, 1, 0, null); 

    void TimerCallBack(object state) 
    { 
     //Do something 
    } 
} 

答えて

1

すべてを行う必要があるの初期化を移動しています

class test 
{ 
    private MyTimer _timer; // Removed field initializer. 

    // Added constructor. 
    internal test() 
    { 
     // Moved initialization of _timer into constructor. 
     _timer = new MyTimer(TimerCallBack, 1, 0, null); 
    } 

    void TimerCallBack(object state) 
    { 
     //Do something 
    } 
} 

エラーがフィールド初期化子が非を使用できないことを示している。このようなコンストラクタへ_timerオブジェクト(この場合は、TimerCallBackメソッド)。フィールド初期化子はコンストラクタの前に実行されるため、インスタンスの構築前にフィールド初期化子がインスタンスメンバ(つまり、TimerCallBackメソッド)を使用する方法はありません。

0

TimerCallbackを使用しないでください!

あなたがここのようなデリゲートを定義することができます

public class MyClass 
    { 
     public delegate void callableMethod(); 
     callableMethod outsideMethod; 

     public MyClass(callableMethod usersMethod) 
     { 
      outsideMethod = usersMethod; 
     } 
    } 

をそしてあなたはMyClassの中にこのどこかのようにそれを呼び出すことができます。

outsideMethod(); 
+0

TimerCallbackが何であるかを正確である - それは、オブジェクトを取ってデリゲートです空を返す。あなたの提案と元のポスターのコードとの間には実質的な違いはなく、インスタンスが存在する前にインスタンスメソッドを渡そうとしていた問題を解決することはできません。 – PMV

+0

ああ、私は正しく読まなかった。 その場合、私は元のポスターが自分のアーキテクチャに疑問を抱いていると思います。非常に珍しいことをあなたが気づいたときに、しばしばより良い方法があります。後者はほとんどの時間が必要ではありません。 – Ravior

関連する問題