Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否将我自己的参数发送到事件处理程序?_C#_Event Handling - Fatal编程技术网

C# 是否将我自己的参数发送到事件处理程序?

C# 是否将我自己的参数发送到事件处理程序?,c#,event-handling,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合作的。这是我的代码,然后我的问题如下:

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));
所以,是的,我只想在将另一个参数添加到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){

}
-vs-


AppDomain.CurrentDomain将引发事件并传递参数,+=行只是将处理程序注册到事件,那里的参数没有任何意义

类比:


你向邮递员登记你的地址,邮递员稍后会把邮件送到那个地址。当你在邮局登记的时候,你不会把你想要的邮件交给他们

更技术一点:您正在向事件的方法注册一个委托。这不是对方法的调用。 这有点类似:

Action<object, ResolveEventArgs> handleItDelegate = HandleIt;
更新:

在一条评论中,您阐明了您想要实现的目标:您想要触发事件,因此您的程序集被加载。你不能那样做,你认为它是有效的。要手动加载程序集,只需这样做,无需事件。当运行时尝试解析引用的程序集但找不到它时,将调用该事件。

当触发该事件时,参数将传递给方法。如果要绑定其他参数,可以使用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
}
其中someArgument是您希望绑定的值

这本质上是使用lambdas来部分应用函数。C#不直接支持的东西,但在其他语言中非常常见。部分应用程序与存在于F#和Haskell等语言中的Curry(当然,因为这个概念的名称来自Haskell Curry)和其他各种函数语言密切相关。它们在结果类型上有所不同

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

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

System.Console.WriteLine(f());
inti=1;
Func f=()=>i;
i=2;
System.Console.WriteLine(f());
2
打印到控制台。因为闭包捕获变量的引用,而不是所述变量的值。当关闭for循环的循环变量时,这是for循环中的常见错误。

这是不可能的。 在本例中,HandleIt是对的委托,并且必须与ResolveEventHandler的签名匹配

a.AssemblyResolve += new ResolveEventHandler(HandleIt);
在这一行中设置它只是告诉代码在引发AssemblyResolve时要执行什么。引发AssemblyResolved事件的东西将传递它的参数。您可以使用自己的参数重新引发另一个事件,并将其挂接到另一个处理程序(或者只调用一个方法)


编辑:或者你可以用Lamda的:o

当然,我可以看到我的理解比我以前认为的还要糟糕。也许我想做的事情根本没有意义,这就是:我故意触发AssemblyResolve来选择自己的DLL在运行时加载。我希望能够这样说:通过向AssemblyResolve事件处理程序传递一个参数来加载这个或那个dll。这会改变什么吗?看看Rune FS的答案。而且,如果这是你想要做的,这应该是你的问题!投票支持这个而不是我的回答这无助于实现他手动触发事件的目标。查看我答案中的更新。@Daniel问题中的哪里提到了手动触发事件?你能看到我的附录吗?Lambda表达式看起来有点混乱(这只是我盲目的直觉告诉我的),但它们确实简化了代码。哪一个是最好的方法?他在对asawyer回答的评论中这样说。这是“最佳实践”方法吗?我可以看到,我可以通过lambda表达式添加一些杂乱的参数。这就是我过去处理此类问题所做的。lambda的功能非常灵活,在lambda版本中不需要if(aBool),只需说
a.AssemblyResolve+=(objects s,ResolveEventArgs a)=>句柄(s,a,aBool)或参数应该是什么
int i = 1;
Func<int> f = () => i;
i = 2;

System.Console.WriteLine(f());
a.AssemblyResolve += new ResolveEventHandler(HandleIt);