2012-03-02 91 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'變量的位置在哪裏?你能告訴我們該方法的簽名嗎? – 2012-03-02 19:21:26

+0

確定一分鐘 – 2012-03-02 19:24:37

+1

你得到了什麼編譯器錯誤? – CodesInChaos 2012-03-02 19:26:56

回答

4

如果lambda表達式本身在實例方法內,那應該沒問題......但如果它是靜態方法,那麼您期望調用哪個實例RemovePlayer

(順便說一句,update_players_login是一個非常非常規類型名稱UpdatePlayersLogin會更好。)

編輯:好的,我的猜測是,你聲明一個實例變量,就像這樣:

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

    void Foo() 
    { 
    } 
} 

如果不是這樣,請澄清您的帖子,因爲它目前缺少重要信息。

如果的情況下,問題僅僅是一個實例變量初始化不能引用this ...但你可以在構造函數初始化它來代替:

class SomeClass 
{ 
    Action action; 

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

    void Foo() 
    { 
    } 
} 

我也要除非您打算將其重新分配到其他地方,否則請將該字段設置爲readonly

+0

你在一個實例方法中意味着什麼? 它嵌套在一個類中... – 2012-03-02 19:23:40

+0

@eran實例方法是一種非靜態方法。 – CodesInChaos 2012-03-02 19:26:12

+0

@eranotzer:就像一個實例變量?以前這樣說會很有幫助。將編輯。 – 2012-03-02 19:26:42

相關問題