我需要从异步操作调用非静态方法, 为了方便我使用 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/