C# 使用自定义参数创建对方法的事件委托

C# 使用自定义参数创建对方法的事件委托,c#,asp.net,.net,vb.net,reflection,C#,Asp.net,.net,Vb.net,Reflection,我正在努力使.Net Reflection能够处理以下情况 (下面是VB.Net,但我将其标记为C#,希望能从更广泛的受众中找到答案。如果C#答案由于语言限制无法转换为VB.Net,至少我知道如果需要,我可以用C#重新编写。) 我正在编写一个.Net 4.5.2 DLL,我可以将其放入现有的ASP.Net 4.5.2生产网站,因此我不需要重建网站。在新的DLL中,我使用反射查找一个类,添加一个事件委托,然后调用一个方法 我遇到的问题是,事件委托需要绑定到带有参数类的本地函数,该参数类也需要通过反

我正在努力使.Net Reflection能够处理以下情况

(下面是
VB.Net
,但我将其标记为
C#
,希望能从更广泛的受众中找到答案。如果
C#
答案由于语言限制无法转换为
VB.Net
,至少我知道如果需要,我可以用
C#
重新编写。)

我正在编写一个.Net 4.5.2 DLL,我可以将其放入现有的ASP.Net 4.5.2生产网站,因此我不需要重建网站。在新的DLL中,我使用反射查找一个类,添加一个事件委托,然后调用一个方法

我遇到的问题是,事件委托需要绑定到带有参数类的本地函数,该参数类也需要通过反射找到

在无法重建的现有DLL中,我有以下内容(以下内容是在这里手工编写的,没有复制,因此可能包含轻微的打字错误)

公共类OldClass
'用于事件的eventargs的嵌套类
公共类OldClassEventArgs
继承事件参数
公共属性错误标记为String=“”
末级
'事件委托
公共委托子OldClassEventDelegate(将值e作为OldClassEventsRG)
"事件本身,
公共事件OldClassEvent作为OldClassEventDelegate
'一种方法,它执行一些操作,然后引发事件
公共子OldClassMethod(Byval arg1作为字符串)
RaiseEvent OldClassEvent(新的OldClassEventArgs())
端接头
末级
在新的DLL中,我希望能够创建
OldClass
的实例,将事件处理程序绑定到
OldClassEvent
并调用
OldClassMethod
。。。结果调用本地事件处理程序,参数为
OldClassEventArgs
的实例

公共类MyPage
继承System.Web.UI.Page
公共子页加载(ByVal发送方作为对象,ByVal e作为事件参数)
'获取现有网站DLL的程序集
Dim assem As Assembly=GetAssembly()
'获取现有网站中的类的类型
Dim oldClassType As Type=assem.GetType(“OldClass”,False,True)
'创建类的实例
Dim oldClassObj as Object=Activator.CreateInstance(oldClassType,False)
'获取本地事件处理程序
Dim eventMethod作为MethodInfo=Me.GetType().GetMethod(“LocalEventHandler”、BindingFlags.NonPublic或BindingFlags.Instance)
'获取事件信息
Dim eventInf As EventInfo=logonType.GetEvent(“OldClassEvent”)
'创建委托
Dim del As[Delegate]=[Delegate].CreateDelegate(eventInf.EventHandlerType,oldClassObj,eventMethod)
'将委托添加到事件中
eventInf.AddEventHandler(classObj,del)
'获取要调用的方法
Dim methodInf作为MethodInfo=logonType.GetMethod(“OldClassMethod”、BindingFlags.Public或BindingFlags.Instance)
”他说
调用(oldClassObj,New Object(){“foobar”})
端接头
'以下情况无法发生,因为需要通过反射找到OldClassEventArgs!
受保护的子LocalEventHandler(ByVal e作为OldClass.OldClassEventArgs)
“用e.MiscArgs做点什么
终点
末级
正如您在上面的代码中所看到的,我不可能使用
OldClass.OldClassEventsArgs
,因为它在当前上下文中不存在。。。只有通过反射

如何使用通过反射找到的类作为参数来创建方法??

即使我让本地处理程序将
ByVal e作为对象
我仍然会得到运行时错误

无法绑定到目标方法,因为其签名或安全透明性与委托类型的签名或安全透明性不兼容

。。。创建
Delgate


更新

根据@jmcilhinney的评论,我还尝试了以下方法声明(使用
EventArgs
),它仍然会导致与以前相同的运行时错误

受保护的子LocalEventHandler(ByVal e作为EventArgs)
终点

创建委托实例时,我们需要使用包含委托方法的实例

eventMethod=>MethodInfo(LocalEventHandler)位于MyPage类上

你需要改变

Dim del As [Delegate] = [Delegate].CreateDelegate(eventInf.EventHandlerType, oldClassObj, eventMethod)


所有事件处理程序都应具有
sender
类型为
Object
的参数和
e
类型为
EventArgs
或派生类型的参数。如果代码编写正确,则
OldClassEventArgs
继承
EventArgs
,并且您的方法可以声明为
受保护的Sub-LocalEventHandler(发送方作为对象,e作为EventArgs)
,它将正常工作。您认为应该有一个
sender
参数,但在这种情况下,没有。。。同样正确的是,事件args是从
EventArgs
继承的(我将很快更新上面的代码以显示这一点)。然而,将方法更改为
e As EventArgs
仍然会导致相同的运行时错误message@jmcilhinney在
eventags
之前,我刚刚重建了通过
sender As Object
的系统,它对结果没有任何影响。您不能添加对旧程序集的引用,以便使用其中的类吗直接?不幸的是@Craig这是不可能的。。。加上我现在有上面的代码工作,感谢leventYou提供的答案,先生,你是一个绝对的明星。。。太简单了!现在我只需要弄清楚如何将
e转换为EventArgs
OldClassEventArgs
Dim del As [Delegate] = [Delegate].CreateDelegate(eventInf.EventHandlerType, Me, eventMethod)