c# - 将我自己的参数发送给事件处理程序?

标签 c# event-handling

我专门使用 AssemblyResolve。首先是我的代码,然后是我的问题:

var a = AppDomain.CurrentDomain;
a.AssemblyResolve += new ResolveEventHandler(HandleIt);

Private Assembly HandleIt(object sender, ResolveEventArgs args){
    //Does stuff, returns an assembly
}

所以我将 HandleIt 添加到我的 AssemblyResolve 事件中。我如何将它添加到该事件并传递一个参数,如:

a.AssemblyResolve += new ResolveEventHandler(HandleIt(AnArgument));

这让我很反感,因为 HandleIt 接受参数,但是当它被添加到 AssemblyResolve 事件时没有明确传递。我希望是这样的:

a.AssemblyResolve += new ResolveEventHandler(HandleIt(aSender,someArgs));

是的,我只想在将 HandleIt 函数添加到我的 AssemblyResolve 事件时向其发送另一个参数。

希望这是有道理的,谢谢。

附录:

if(aBool){
    a.AssemblyResolve += new ResolveEventHandler(HandleA);
}
else{
    a.AssemblyResolve += new ResolveEventHandler(HandleB);
}

HandleA(object sender, ResolveEventArgs args){
    Handle(true);
}
HandleB(object sender, ResolveEventArgs args){
    Handle(false);
}
Handle(bool isA){

}

-对比-

if(aBool){
    a.AssemblyResolve += (object s, ResolveEventArgs a) => Handle(s,a,true);
}
else{
    a.AssemblyResolve += (object s, ResolveEventArgs a) => Handle(s,a,false);
}

Handle(object sender, ResolveEventArgs args, bool isA){

}

最佳答案

当事件被触发时,参数被传递给方法,如果你想绑定(bind)额外的参数,你可以使用 lambda 表达式来实现

var a = AppDomain.CurrentDomain;
a.AssemblyResolve += (object s,ResolveEventArgs a) => HandleIt(s,a,someArgument);

Private Assembly HandleIt(object sender, ResolveEventArgs args, SomeType arg){
    //Does stuff, returns an assembly
}

其中 someArgument 是您希望绑定(bind)的值。

这实际上是使用 lambda 来执行函数的部分应用。 C# 不直接支持但在其他语言中很常见的东西。部分应用程序与存在于 F# 和 Haskell 等语言中的 Currying 密切相关(因为这个概念的名称来自 Haskell Curry)和其他各种函数式语言。它们的结果类型不同。

它们都与闭包相关(如上述代码中的概念所称),并且在不支持部分应用或柯里化(Currying)的语言中,您可以使用闭包来完成类似的事情。但是请注意,闭包与部分应用程序的不同之处在于可能会产生一些令人惊讶的错误。例如。

int i = 1;
Func<int> f = () => i;
i = 2;

System.Console.WriteLine(f());

打印 2 到控制台。因为闭包捕获对变量的引用,而不是所述变量的值。当关闭 for 循环的循环变量时,这是 for 循环中的常见错误。

关于c# - 将我自己的参数发送给事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5278569/

相关文章:

wpf - DataTemplate 中的事件处理程序

java - 如果操作不是由用户触发的,如何禁用 SWT 事件监听

java - 洋葱架构 : Should UI project have access to Domain Layer?

c# - 使用 C#.net (Microsoft.Office.Interop.Excel) 在 Excel 中删除折线图中的网格线

javascript - 通用日期时间格式

c# - 将数据推送到列表时,对 Redis 中持有错误类型值的键进行操作

objective-c - 使用事件来处理 Mac OS X 上的全局热键

c# - 从单个 DataTable 对象中的存储过程返回多个结果集

javascript - 为什么输入对象的 value 属性不保存值?

c++ - C++ 中的多线程事件处理