2012-01-01 2 views
4

создать C# динамический объект СОМ-объекта на парование пути:Приложить событие динамического объекта

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

Класс clsPDFCreator является определяющим событие, призывающее eReady. Но когда я пытаюсь зарегистрировать EventHandler как

pdfCreator.eReady += _PDFCreator_eReady; 

Я получаю сообщение об ошибке «Оператор„+ =“не может быть применен к операндам типа„динамической“и" метод группы».

Как я могу зарегистрировать EventHandler для события, объявленного динамическим объектом?

+0

Где 'dynamic' здесь? –

+0

@Cicada - Извините, я не ошибся, упрощая код. Я изменил свой пост сейчас. – BennoDual

ответ

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

+0

@TcKs - Скорее всего, но если вы все равно его настроите, то почему это имеет значение? –

+0

Итак, это решение является хорошей идеей только во время инициализации не в дальнейшем пользователем, понимаете, я прав ?. – TcKs

7

Поскольку тип делегата не известен во время компиляции, вы должны указать его. Action делегат соответствует методам без параметров или возвращаемого значения:

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

Предположим, что обработчик событий имеет такие аргументы, как этот public void _PDFCreator_eReady (отправитель объекта, MyCustomArgument e) {} В этом случае будет ли код регистрации событий? – Aneesh

+1

@Aneesh: 'pdfCreator.eReady + = новое действие <объект, MyCustomArgument> (_ PDFCreator_eReady);' –

0

Я закончил с использованием следующих, как и другие варианты не работают. Вы, возможно, придется использовать родовое из < T>, если ваш EventHandler является родовым

pdfCreator.eReady += new System.EventHandler(_PDFCreator_eReady); 
Смежные вопросы