c# - 不能从匿名方法引用非静态方法

标签 c# .net anonymous-methods

我需要从异步操作调用非静态方法, 为了方便我使用 apm design ,通过定义一个委托(delegate)给它分配一个匿名方法 并对其调用 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);                     
                . . . . .
         }
        ..... 
    }

有什么方法可以引用非静态方法吗?

最佳答案

如果 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

关于c# - 不能从匿名方法引用非静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9539036/

相关文章:

c# - 犀牛模拟 : How to return conditional result from a mock object method

c# - 执行 IDbConnection.Query 给出异常 : Conversion failed when converting the nvarchar value 'Memory to data type int'

c# - 在 WPF 中绘制 tile-map 的最简单方法

c# - .NET 构建过程和链接

C#:是否可以在匿名方法中声明局部变量?

c# - IEnumerable 中的求和、平均、连接等项的实现选项

c# - 更新记录 Linq-to-SQL

c# - 简单的mysql插入查询给出错误

c# - 将 Action 和 Func 结合在一个参数中

c# - 为什么在 SqlDataReader 关闭之前我不能使用 SqlConnection 实例?