我专门使用 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/