2012-03-02 19 views
1

非同期操作から非静的メソッドを呼び出す必要があります。 私はapmデザインを使用しています。代理人を定義して匿名メソッド を割り当てて呼び出しますそれにbeginInvoke。つまり、なぜ私の驚きには非匿名メソッドから非静的メソッドを参照できません

私は私の実装から

任意のアイデアを非静的メソッドを参照することができませんでしたか?

public delegate void UpdatePlayersLogin(IServerCallback callback, Guid callback_playerId, Player player, List<IServerCallback> toRemove, ManualResetEvent handel); 

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant , InstanceContextMode = InstanceContextMode.PerSession)] 
public class ServerService : IServer 
{ 

    UpdatePlayersLogin updateLogin = (callback, callback_playerId, player, toRemove, handle) => 
    { 
     try 
     { 
      callback.PlayerChangedStatus(player); 
     } 
     catch (Exception) 
     { 
      RemovePlayer(callback, callback_playerId, toRemove); 
     } 
     finally 
     { 
      handle.Set(); 
     } 
    }; 

    . 
    . 
    private void RemovePlayer(IServerCallback callback, Guid playerId, List<IServerCallback> toRemove) 
    { . . . . . . } 

    private void NotifyPeersOfClientLogin(Player player) 
    { 
     . . . . . 
     foreach (var key_CallBackPair in players) 
     { 
       handels[i] = new ManualResetEvent(false); 
       updateLogin.BeginInvoke(key_CallBackPair.Value, key_CallBackPair.Key, player, toRemove, handels[i], null, null);      
       . . . . . 
     } 
     ..... 
    } 

私は非静的メソッドを参照できる方法はありますか?

+0

囲みの範囲を教えてもらえますか?つまり、 'updateLogin'変数はどこで宣言されていますか?そのメソッドの署名を表示できますか? –

+0

確かに1分 –

+1

コンパイルエラーはありますか? – CodesInChaos

答えて

4

ラムダ式自体がインスタンスメソッド内にある場合は問題ありませんが、静的メソッドの場合は、RemovePlayerが呼び出されるインスタンスは何でしょうか?

(余談としては、 update_players_loginは非常に異例の型名です UpdatePlayersLoginが良いだろう。。)

EDIT:さて、私の推測では、あなたがこのように、インスタンス変数を宣言しているということです。

class SomeClass 
{ 
    Action action =() => Foo(); 

    void Foo() 
    { 
    } 
} 

そうでない場合は、現時点で重要な情報が不足しているため、投稿を明確にしてください。

その場合であれば、問題はインスタンス変数の初期化子がthisを参照することができないだけということです...しかし、あなたの代わりに、コンストラクタでそれを初期化することができます。

class SomeClass 
{ 
    Action action; 

    public SomeClass() 
    { 
     action =() => Foo(); 
    } 

    void Foo() 
    { 
    } 
} 

私も希望他の場所に再割り当てしない限り、フィールドreadonlyを作成してください。

+0

インスタンスメソッド内ではどういう意味ですか? クラス内でネストされています... –

+0

@eranインスタンスメソッドは非静的メソッドです。 – CodesInChaos

+0

@eranotzer:インスタンス変数と同じですか?前に言っておくと助かりました。編集します。 –

関連する問題