не может ссылаться на нестатический метод из анонимного метода - PullRequest
1 голос
/ 02 марта 2012

мне нужно вызвать нестатический метод из асинхронной операции, для удобства я использую дизайн 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);                     
                . . . . .
         }
        ..... 
    }

есть ли способ ссылаться на нестатический метод?

1 Ответ

4 голосов
/ 02 марта 2012

Хорошо, если само лямбда-выражение находится в методе экземпляра ... но если оно в статическом методе, то какой экземпляр вы ожидаете вызвать RemovePlayer?

(Кроме того, update_players_login - это весьма нетрадиционное имя типа. UpdatePlayersLogin было бы лучше.)

РЕДАКТИРОВАТЬ: Хорошо, я предполагаю, что вы объявляете переменную экземпляра, как это:

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

    void Foo()
    {
    }
}

Если это не так, пожалуйста, уточните свой пост, потому что в данный момент отсутствует важная информация.

Если это * , проблема в том, что инициализатор переменной экземпляра не может ссылаться на this ... но вы можете вместо этого инициализировать его в конструкторе:

class SomeClass
{
    Action action;

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

    void Foo()
    {
    }
}

Я бы также сделал поле readonly, если вы не собираетесь переназначить его где-то еще.

...