我正在使用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)
当事件被触发时,如果你想绑定其他参数,你可以使用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循环中的常见错误.