2012-01-01 79 views
4

创建在休耕方式COM-Object的C#动态对象:附加事件来动态对象

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

类clsPDFCreator被定义事件调用eReady。但是,当我尝试注册一个EventHandler像

pdfCreator.eReady += _PDFCreator_eReady; 

我得到的错误消息“操作员‘+ =’不能被施加到型‘动态’和‘方法组’的操作数”。

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

+0

这里'dynamic'在哪里? – 2012-01-01 17:21:18

+0

@Cicada - 对不起,我在简化代码的时候并没有犯错。我现在改变了我的帖子。 – BennoDual 2012-01-02 15:14:48

回答

4

如何:

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() 
{ 

} 
+0

请问“pdfCreator.eReady = null;”清除之前附加的事件? – TcKs 2012-01-01 17:05:44

+0

@TcKs - 最有可能的,但是如果你打算再次设置它,那么为什么它很重要? – 2012-01-01 17:07:51

+0

所以这个解决方案只是在初始化期间不是进一步用户的好主意,理解它我是对的。 – TcKs 2012-01-01 17:15:42

7

由于委托类型在编译时不知道,你必须指定它。该Action委托匹配不带任何参数或返回值的方法:

pdfCreator.eReady += new Action(_PDFCreator_eReady); 
+0

假设事件处理程序具有类似这样的参数public void _PDFCreator_eReady(object sender,MyCustomArgument e){}在这种情况下,事件注册码是什么? – Aneesh 2014-05-09 06:29:18

+1

@Aneesh:'pdfCreator.eReady + = new Action (_ PDFCreator_eReady);' – 2014-05-09 13:16:51

0

最后我用下面的其他选项没有工作。如果你的EventHandler是通用的,你可能必须使用通用的< T>

pdfCreator.eReady += new System.EventHandler(_PDFCreator_eReady);