2012-03-02 3 views
1

Мне нужно вызвать нестатический метод из операции async, для облегчения использования дизайна 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

Какая ошибка компилятора вы получаете? – 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: Как переменная экземпляра? Было бы полезно сказать это раньше. Будет редактировать. –

Смежные вопросы