Refleksyjne delegacje :)

Odpowiedz Nowy wątek
2011-07-17 17:13
0

Witam wszystkich forumowiczów, to mój pierwszy post na tym forum :)

Mam trochę dziwny problem i nie wiem czy ma on rozwiązanie. Chodzi o tworzenie delegacji z metod zdefiniowanych w klasie, spełniających określone kryteria (np. nazwa pasująca do wzorca). Poniżej przedstawiam fragment kodu prezentujący moje pytanie.
Zasadnicze pytanie dotyczy tego co wpisać zamiast ???? w konstruktorze

new FunkcjaSprawdzajaca( ???? )
 
using System;
using System.Reflection;
using System.Collections;
 
namespace Jakas {
 
    public delegate bool FunkcjaSprawdzajaca();
 
    public class MyClass {
 
        private bool spn_1() {
            return false;
        }
        private bool spn_2() {
            return false;
        }
        private bool spn_3() {
            return false;
        }
        private bool spn_4() {
            return false;
        }
 
        private ArrayList tabSpr;
 
        public MyClass() {
            tabSpr = new ArrayList();
            foreach(MethodInfo mi in this.GetType().GetMethods()) {
                if (mi.Name.StartsWith("spn")) {
                    FunkcjaSprawdzajaca fs = new FunkcjaSprawdzajaca( ???? ); // Tutaj powinien być jakiś uchwyt do odpowiedniej spn_X
                    tabSpr.Add(fs);
                }
            }
        }
    }
}

Proszę o informację, czy da się coś takiego osiągnąć i jeżeli tak, to jak :)

Pozdrawiam serdecznie
Sołtys

Pozostało 580 znaków

2011-07-17 17:47
1

Spróbuj Delegate.CreateDelegate.

Pozostało 580 znaków

2011-07-17 17:49
Rev
  1. Zrezygnuj z tego średniowiecznego ArrayList, użyj List<>.
  2. GetMethods() zwróci ci tylko publiczne metody, jako parametr daj flagi BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance.
  3. Jak napisał już Somekind, powinno zadziałać: FunkcjaSprawdzajaca fs = (FunkcjaSprawdzajaca)Delegate.CreateDelegate(typeof(FunkcjaSprawdzajaca), null, mi);

Pozostało 580 znaków

2011-07-17 18:22
0

Wielkie dzięki, działa jak chciałem :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0