可以';t从匿名方法引用非静态方法

本文关键字:方法 引用 静态方法 可以 | 更新日期: 2023-09-27 18:26:33

我需要从异步操作调用一个非静态方法,为了方便起见,我使用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);                     
                . . . . .
         }
        ..... 
    }

有没有一种方法可以引用非静态方法?

可以';t从匿名方法引用非静态方法

如果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,除非您打算将其重新分配到其他地方。