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

soo*_*ise 4 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
}
Run Code Online (Sandbox Code Playgroud)

所以我将HandleIt添加到我的AssemblyResolve事件中.如何将其添加到该事件并使用它传递参数,如:

a.AssemblyResolve += new ResolveEventHandler(HandleIt(AnArgument));
Run Code Online (Sandbox Code Playgroud)

自从HandleIt接受参数以来,这就让我失望了,但是当它被添加到AssemblyResolve事件时,没有一个被明确地传递掉.我希望有类似的东西:

a.AssemblyResolve += new ResolveEventHandler(HandleIt(aSender,someArgs));
Run Code Online (Sandbox Code Playgroud)

所以是的,我只是希望能够在将其添加到我的AssemblyResolve事件时向HandleIt函数发送另一个参数.

希望有道理,谢谢.

附录:

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){

}
Run Code Online (Sandbox Code Playgroud)

航班吗

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){

}
Run Code Online (Sandbox Code Playgroud)

Run*_* FS 8

当事件被触发时,如果你想绑定其他参数,你可以使用lambdaexpression将参数传递给该方法

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
}
Run Code Online (Sandbox Code Playgroud)

其中someArgument是您要绑定的值.

这主要是使用lambdas来部分应用函数.C#不直接支持的东西,但在其他语言中很常见.部分应用与当然存在于F#和Haskell等语言中的Currying密切相关(因为该概念的名称来自Haskell Curry)和各种其他功能语言.它们的结果类型不同.

它们都与闭包相关(如上面代码中的概念所示),并且在不支持部分应用或curry的语言中,您可以使用闭包来完成类似的操作.但请注意,闭包与部分应用的区别在于可能会产生一些令人惊讶的错误.例如

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

System.Console.WriteLine(f());
Run Code Online (Sandbox Code Playgroud)

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