2012-01-01 50 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);