我正在研究一个庞大的现有代码,我需要将其适应其他环境 这来自DLL:
public interface IGH_DocumentObject : IGH_InstanceDescription
{
public delegate void PingDocumentEventHandler(IGH_DocumentObject sender, GH_PingDocumentEventArgs e);
event PingDocumentEventHandler PingDocument;
}
以下是其他方法引用的示例:
private void UnregisterObjectEvents(IGH_DocumentObject obj)
{
obj.PingDocument -= new IGH_DocumentObject.PingDocumentEventHandler(this.DocObjectPingDocument);
}
我无法更改对此代码的每个引用,因此我要找到一种方法,使用上面的接口使第二个代码工作
答案 0 :(得分:0)
OP在任何情况下都拒绝向我展示没有委托构造函数的代码版本,或者告诉我编译器给他的错误消息。他最终发明了一些解决方法。
然而,对于他所看到的内容有一个解释,这是一个非常简单的解决方法。
在C#中,禁止在接口中定义委托类型(或任何类型)。在VB.NET中,它是允许的。因此,他们反编译的程序集必须用VB.NET编写(或者可能是其他一些允许相同的.NET语言,但VB是自然的候选者 - C ++ / CLI是否允许它?)。
所以C#编译器看到了这个,它显然是非法的代码:
obj.PingDocument -= new IGH_DocumentObject.PingDocumentEventHandler(this.DocObjectPingDocument);
显而易见的解决方案是:
obj.PingDocument -= this.DocObjectPingDocument;
如果处理程序具有正确的原型,您就不需要委托构造函数。因此this.DocObjectPingDocument
具有正确的原型是有效的,因为C#编译器并没有被迫接受令人尴尬的事实,即它的小兄弟VB.NET编译器具有它没有的功能。
但是OP声称它不起作用。他拒绝向我展示他尝试过的代码。所以他可能没有尝试过,或者他没有做我告诉他的事情 - 但另一个可能的解释是事件处理程序有错误的原型。
可以在没有委托构造函数的情况下添加和删除以下事件处理程序。我复制了VB.NET程序集中的接口定义,从C#程序集引用它,并对其进行了测试。由于他给出的原因,这个编译和OP的版本与构造函数不编译。
protected void DocObjectPingDocument(IGH_DocumentObject sender,
GH_PingDocumentEventArgs e)
{
}
如果没有委托构造函数,则无法添加和删除(至少在C#中):
protected void DocObjectPingDocument(IGH_DocumentObject sender,
EventArgs e)
{
}
protected void DocObjectPingDocument(object sender,
GH_PingDocumentEventArgs e)
{
}
值得包括这个答案,因为VB.NET的这个功能可能会导致其他人遇到同样的问题。