Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将事件附加到动态对象_C#_.net_Events_C# 4.0_Dynamic - Fatal编程技术网

C# 将事件附加到动态对象

C# 将事件附加到动态对象,c#,.net,events,c#-4.0,dynamic,C#,.net,Events,C# 4.0,Dynamic,我以休闲方式创建COM对象的c#动态对象: dynamic pdfCreator = Activator.CreateInstance( Type.GetTypeFromProgID("PDFCreator.clsPDFCreator")); 类clsPDFCreator正在定义调用eReady的事件。但是当我尝试注册一个事件处理程序时 pdfCreator.eReady += _PDFCreator_eReady; 我收到错误消息“运算符'+=

我以休闲方式创建COM对象的c#动态对象:

dynamic pdfCreator = Activator.CreateInstance(
                       Type.GetTypeFromProgID("PDFCreator.clsPDFCreator"));
类clsPDFCreator正在定义调用eReady的事件。但是当我尝试注册一个事件处理程序时

pdfCreator.eReady += _PDFCreator_eReady;
我收到错误消息“运算符'+='不能应用于'dynamic'和'method group'类型的操作数”

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

如何:

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 += new Action(_PDFCreator_eReady);

我最终使用了以下选项,因为其他选项不起作用。如果EventHandler是泛型的,则可能必须使用generic of

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

“pdfCreator.eReady=null;”是否会清除先前附加的事件?@TcKs-很可能,但如果您仍要再次设置它,那又有什么关系呢?因此,此解决方案仅在初始化过程中是个好主意,而不是在进一步的用户中,我正确理解它?@TcKs-不一定。正如我在上一篇评论中指出的,如果你无论如何都要覆盖事件,那么在设置之前清除之前附加的事件又有什么关系呢?@M.Babcock-对不起,我在简化代码时忘记了帖子中的动态关键字-我现在已经更改了。@Cicada-对不起,我在简化代码时没有犯错误。我现在已经更改了我的帖子。假设事件处理程序有如下参数:public void\u PDFCreator\u eReady(object sender,MyCustomArgument e){}在这种情况下,事件注册码是什么?@Aneesh:
PDFCreator.eReady+=new Action(\u PDFCreator\u eReady)