【问题标题】:How can I provide a delegate in a managed interface class如何在托管接口类中提供委托
【发布时间】:2010-07-20 14:54:44
【问题描述】:

我正在处理一个包含部分 C#、托管 C++ 以及非托管 C++ 代码的项目。我正在使用 .NET 3.5。

我的编程经验更多是在非托管 C++ 方面,我对 .NET 的概念不太熟悉。

我的问题是:如何在托管接口类后面隐藏/提供委托。

假设我的界面看起来……像这样……

// I guess this is a type definition so it has to be placed outside of the interface
delegate void SignalStrengthDelegate(short input);

public interface class Test
{
    event SignalStrengthDelegate^ signalStrengthChanged;

    void doSomething();
};

... 然后我在实现此接口的 ref 类中收到编译器错误。该错误表明我应该实现添加删除代表的方法。尝试执行此操作后,编译器要求我切换到 /clr:oldSyntax... 所以这也不是我想要的。

我在谷歌上搜索了很多,但找不到任何关于我的问题的建议......在某些时候,我觉得委托和接口是某种相反的概念,不应该混为一谈。

有什么建议吗?

TIA!

【问题讨论】:

    标签: .net delegates c++-cli


    【解决方案1】:
    【解决方案2】:

    好吧,您是在声明一个事件 - 一个事件基本上是一个添加/删除对。这就是您收到编译器错误的原因。我怀疑你可以做到这一点,只是不使用你一直使用的语法。如果不能在 C++/CLI 中实现事件,那就太奇怪了。

    您可能想阅读我在events, delegates and the differences between them 上的文章。

    真正想做什么?你想要一个委托类型的属性吗?还是以委托类型作为参数的方法?你说你想“隐藏/提供一个代表”——你到底是什么意思?

    【讨论】:

    • 乔恩,C#4 似乎可以很好地处理接口中的事件。它只是迫使你在实现类中重复它。
    • @Henk:是的,C# 一直允许您在界面中指定事件。我相信是 C++ 中的实现导致了 OP 的悲痛。
    • 谢谢!我想要做的是提供一个 c++/cli-interface,它对 C#-caller 隐藏了实现(该接口将是其他一些人使用的 API 的一部分,我想对他们隐藏一些使用的方法在 c++/cli-parts 中);参考上面的片段并假设有一个实现接口Test的类TestImpl,C#代码应该看起来......像这样... 测试测试 = new TestImpl(); test.signalStrengthChanged +=new Test.SignalStrengthDelegate(signalStrengthChanged);
    • ...所以乔恩,你是对的...接口的实现导致了我的问题;我只是不知道如何满足编译器。 :)
    • @Superfisi:不幸的是,我不知道它的 C++/CLI 语法——但看起来 Ben 的链接会对你有所帮助。
    【解决方案3】:

    我挖了一篇似乎显示正确语法的文章:http://msdn.microsoft.com/en-us/magazine/cc163659.aspx

    【讨论】:

    • 那不是 C++/CLI。请让 C++ 托管扩展以应有的方式死去。
    • @Ben:stackoverflow.com/questions/462805/… 离目标更近了吗?
    • 是的,但它不包括这个关于抽象事件的问题。
    • @Ben:看起来你已经发布了一个指向抽象事件的好例子的链接。在这一点上,我认为最好给你投票并删除这个答案,因为它充其量是多余的。
    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 2020-08-22
    • 2017-02-21
    • 2012-07-05
    • 2014-08-18
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多