2016-07-14 2 views
1

Я за исключением следующегоСобытие не найдено по типу

Необработанное исключение типа «System.ArgumentException» произошло в WindowsBase.dll

Дополнительная информация: «Событие» событие не найдено по типу «ConsoleApplication .ITest.

в этом Repro:

using System.Windows; // add reference to WindowsBase 

interface IBase 
{ 
    event EventHandler Event; 
} 

interface ITest : IBase { } 

class Test : ITest 
{ 
    public event EventHandler Event; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var test = new Test(); 
     WeakEventManager<IBase, EventArgs>.AddHandler(test, "Event", (s, e) => { }); // works 
     WeakEventManager<ITest, EventArgs>.AddHandler(test, "Event", (s, e) => { }); // exception 
    } 
} 

Почему унаследовали через интерфейсы события не могут быть найдены? Исключение выбрасывается с this method.

+0

кажется WeakEventManager выглядит только для событий ** специально ** в указанном типе - когда я объявил еще одно событие в интерфейсе ITEST и попытался добавить его - он работал нормально. Кажется, вам нужно предоставить самый верхний (в иерархии наследования), чтобы найти событие. Но ** почему ** это так - я здесь не хватает. –

+0

@ jakub-jankowski, кажется, что это ошибка, потому что 'typeof (ITest) .GetEvent (« Event »)' works – Sinatr

ответ

4

Я пробовал различные комбинации вашего примера. Здесь приведен только рабочий код. Кажется, вам нужно знать, где определенное событие определено в иерархии наследования.

using System.Reflection; 
using MS.Internal.WindowsBase; 

namespace EventTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var test = new Test(); 
      WeakEventManager<IBase, EventArgs>.AddHandler(test, "IBaseEvent", (s, e) => { }); // works 
      WeakEventManager<ITest, EventArgs>.AddHandler(test, "ITestEvent", (s, e) => { }); // works 
      WeakEventManager<Test, EventArgs>.AddHandler(test, "TestEvent", (s, e) => { }); // works 
     } 
    } 
    interface IBase 
    { 
     event EventHandler IBaseEvent; 
    } 

    interface ITest : IBase { event EventHandler ITestEvent; } 

    class Test : ITest 
    {   
     public event EventHandler IBaseEvent; 
     public event EventHandler ITestEvent; 
     public event EventHandler TestEvent; 
    } 
} 

Целые комбинации до сих пор;

  WeakEventManager<IBase, EventArgs>.AddHandler(test, "IBaseEvent", (s, e) => { }); // works 
      WeakEventManager<IBase, EventArgs>.AddHandler(test, "ITestEvent", (s, e) => { }); // exception 
      WeakEventManager<IBase, EventArgs>.AddHandler(test, "TestEvent", (s, e) => { }); // exception 

      WeakEventManager<ITest, EventArgs>.AddHandler(test, "IBaseEvent", (s, e) => { }); // exception 
      WeakEventManager<ITest, EventArgs>.AddHandler(test, "ITestEvent", (s, e) => { }); // works 
      WeakEventManager<ITest, EventArgs>.AddHandler(test, "TestEvent", (s, e) => { }); // exception 

      WeakEventManager<Test, EventArgs>.AddHandler(test, "IBaseEvent", (s, e) => { }); // exception 
      WeakEventManager<Test, EventArgs>.AddHandler(test, "ITestEvent", (s, e) => { }); // exception 
      WeakEventManager<Test, EventArgs>.AddHandler(test, "TestEvent", (s, e) => { }); // works 
+0

Я предполагаю, что любая другая комбинация не сработает? – Sinatr

+0

@Sinatr, я добавил все комбинации, которые я пытался ответить, потому что слишком долго комментировать =) – Progressive