C# - 替代接口中的委托类型

时间:2017-02-24 18:19:09

标签: c# types interface delegates

我正在研究一个庞大的现有代码,我需要将其适应其他环境 这来自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);
}

我无法更改对此代码的每个引用,因此我要找到一种方法,使用上面的接口使第二个代码工作

1 个答案:

答案 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的这个功能可能会导致其他人遇到同样的问题。