动态对象添加事件

8

我是一个C#动态对象的COM对象,方式如下:

dynamic pdfCreator = Activator.CreateInstance(
                       Type.GetTypeFromProgID("PDFCreator.clsPDFCreator"));

类 clsPDFCreator 定义了一个调用 eReady 的事件。但是当我尝试注册事件处理程序时:
pdfCreator.eReady += _PDFCreator_eReady;

我收到了一个错误信息:“运算符'+='不能应用于类型为'dynamic'和'method group'的操作数”。

如何向声明为动态对象的事件注册EventHandler?


@Cicada - 抱歉,我在简化代码时没有犯错。我现在已经修改了我的帖子。 - BennoDual
3个回答

8

由于委托类型在编译时不知道,因此必须指定它。 Action 委托匹配没有参数或返回值的方法:

pdfCreator.eReady += new Action(_PDFCreator_eReady);

假设事件处理程序具有以下参数 public void _PDFCreator_eReady(object sender , MyCustomArgument e){ } 在这种情况下,事件注册代码将是什么? - Aneesh
1
@Aneesh:pdfCreator.eReady += new Action<object, MyCustomArgument>(_PDFCreator_eReady); - Edward Brey

5
这个怎么样:
public delegate void eReadyHandler();

static void Main(string[] args)
{
    var comType = Type.GetTypeFromProgID("PDFCreator.clsPDFCreator");
    dynamic pdfCreator = Activator.CreateInstance(comType);
    //dynamic pdfCreator = new PDFCreator.clsPDFCreator();

    //pdfCreator.eReady = null;
    pdfCreator.eReady += new eReadyHandler(_PDFCreator_eReady);
}

public static void _PDFCreator_eReady()
{

}

"pdfCreator.eReady = null;"会清除先前附加的事件吗? - TcKs
@TcKs - 很有可能,但如果你无论如何都要重新设置它,那又有什么关系呢? - M.Babcock
所以这个解决方案只在初始化阶段是一个好主意,而不适用于后续用户,我理解得对吗? - TcKs
@TcKs - 不一定。正如我在上一条评论中指出的那样,如果您无论如何都要覆盖事件,那么在设置事件之前清除先前附加的事件是否重要呢? - M.Babcock
@M.Babcock - 抱歉,我在简化代码时忘记了动态关键字 - 我已经更改了它。 - BennoDual
显示剩余2条评论

0
我最终使用了以下代码,因为其他选项都不起作用。如果您的EventHandler是通用的,则可能需要使用<T>的通用类型。
pdfCreator.eReady += new System.EventHandler(_PDFCreator_eReady);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接