Announcement

Collapse
No announcement yet.

Ermitteln, ob ein Objekt über eine bestimmte Methode verfügt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ermitteln, ob ein Objekt über eine bestimmte Methode verfügt

    Hallo zusammen,

    im konkreten Fall wird das Observer-Pattern implementiert. Die Observer werden in einer ArrayList gespeichert.

    Eine Notify()-Methode werden alle Observer, die sich mit AttachObserver() bei meiner Klasse angemeldet haben, über Änderungen informiert.

    Das ganze sieht so aus:

    foreach (Object observer in observers)
    {
    if (observer is TArtikelListView)
    {
    (observer as TArtikelListView).UpdateView(this);
    }
    if (observer is TArtikelView)
    {
    (observer as TArtikelView).UpdateView(this);
    }
    }

    Nun hätte ich es gerne "generischer". D.h. ich möchte, dass ich nicht mehr konkret angeben muss, von welchem Typ der Observer ist. Wenn das Objekt eine UpdateView(..)-Methode hat, soll Sie eben ausgeführt werden, und wenn nicht eben nicht...

    Kann mir einer sagen, wie das zu machen ist?

    Bodo

  • #2
    Hallo,

    Versuch's doch mal mit
    Code:
    System.Reflection.MethodInfo [] mis = observer.GetType().GetMethods(BindingFlags.Instance|BindingFlags.Public)
    um alle öffentliche Methoden zu ermitteln bzw. mit
    Code:
    System.Reflection.MethoInfo mi = observer.GetType().GetMethod("UpdateView", ...)
    um die Methode "UpdateView" zu ermitteln. Aber Achtung, falls diese überladen ist muss eine entsprechende Überladung von GetMethod gewählt werden, die die Signatur von UpdateView als object [] als Argument erwartet.

    Viele Grüße HP

    Comment


    • #3
      Irgendwie bekomme ich das nicht zusammen,

      könntest du das in mein Beispiel mal einsetzen, damit ich weiss wie ich das verwenden muss?

      Bodo

      Comment


      • #4
        Code:
        class Class1
            {
                public Class1() { }
                public void UpdateView(int a)
                {
                }
        
                public void UpdateView(int a, string b)
                {
                    System.Windows.Forms.MessageBox.Show(b + "; " + a.ToString());
                }
            }
        Code:
        Class1 myClass1 = new Class1(); 
                    
                    // Wir wollen die Überladung mit den Parameter int, string
                    Type[] aArgumentTypes = new Type[2];
                    aArgumentTypes[0] = typeof(int);
                    aArgumentTypes[1] = typeof(string);
        
                    System.Reflection.MethodInfo mi = myClass1.GetType().GetMethod("UpdateView", System.Reflection.BindingFlags.Instance|System.Reflection.BindingFlags.Public, null, aArgumentTypes, null);
        
                    // Die Methode "UpdateView(int, string)" ausführen, wenn vorhanden
                    if (null != mi)
                    {
                        object [] aParams = new object[2];
                        aParams[0] = 9;                         // der int Parameter
                        aParams[1] = "Test";                    // der string Parameter
                        mi.Invoke(myClass1, aParams);
                    }

        Comment

        Working...
        X