2016-07-14 8 views
1

Ich habe folgende AusnahmeEreignis nicht gefunden Typ

Eine nicht behandelte Ausnahme des Typs ‚System.ArgumentException‘ aufgetreten in WindowsBase.dll

Zusätzliche Informationen: ‚Ereignis‘ Ereignis nicht gefunden Typ ‚Consoleapplication .Ich prüfe'.

in diesem 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 
    } 
} 

Warum über Schnittstellen Ereignis geerbt kann nicht gefunden werden? Ausnahme wird von this method geworfen.

+0

Sieht aus wie die WeakEventManager für Veranstaltungen nur sieht ** speziell ** in den angegebenen Typ - wenn ich ein anderes Ereignis in ITest Schnittstelle deklariert haben und versucht, es zu addieren - es ganz gut gearbeitet. Es scheint, dass Sie den obersten (in Vererbungshierarchie) Typ angeben müssen, um das Ereignis zu finden. Aber ** warum ** ist das so - ich falle hier kurz. –

+0

@ jakub-jankowski, es scheint wie ein Fehler, weil 'typeof (ITest) .GetEvent (" Event ")' funktioniert – Sinatr

Antwort

4

Ich habe verschiedene Kombinationen über Ihr Beispiel ausprobiert. Hier kommt der einzige Arbeitscode hier unten. Anscheinend müssen Sie wissen, wo das Ereignis in der Vererbungshierarchie definiert ist.

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; 
    } 
} 

ganze Kombinationen bis jetzt;

  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

Ich denke, jede andere Kombination wird fehlschlagen? – Sinatr

+0

@Sinatr, ich habe alle Kombinationen hinzugefügt, die ich zu meiner Antwort versucht habe, da es zu lange war, um sie zu kommentieren =) – Progressive