Laden...

Rekursiv Methode in Controls aufrufen - Problem mit Obfuscator

Erstellt von Sclot vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.636 Views
S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren
Rekursiv Methode in Controls aufrufen - Problem mit Obfuscator

Hallo 😃

Ich bin grad dabei ein VFP konstrukt auf C# um zu schrieben.
Es geht darum alle Controls einer Form je nach zustand entweder zu disablen oder zu enablen.

in VFP sieht das ganze bei uns so aus:


local element
for each element IN  thisform.controls
	if pemstatus(element,"lock",5)
		element.lock(plwie)
	endif
next

^^ VFP... quickly und dirtyer 😃

Das ganze würde in etwa in C# wie folgt aussehen:


foreach (Control control in this.Controls)
{
    if (control.GetType().GetMethod("controls_lock") != null)
    {
        object[] parameter = new object[1]; 
        parameter[0] = sperren;
        control.GetType().GetMethod("controls_lock").Invoke(control, parameter);
    }
} 

Dies würde die Eigens definierte Methode "controls_lock" innerhalb der Controls aufrufen - falls vorhanden, welche sie dann je nach zustand disablen oder enablen würde.

Das problem ist, das dies mit Reflection gelöst ist.
Wenn ich mit jetzt einen Obfuscator nehme und die Assemby, welche daraus resultiert obfuskiere und sie dann ausführe, funktioniert das ganze Konstrukt nicht mehr, weil die Strings und methoden-namen auch mit unkenntlich gemacht werden.

Also muss irgendwie eine Möglichkeit her, die nicht mit Reflection arbeitet.
Meine Controls sind alle von den Basis-Controls abgeleitet, welche wiederum von "Controls" erben.
Ich hatte schon eine Idee über ExtensionMethods das "Controls" aufzubohren, aber das ist wohl nicht der elegante weg.

Ich steh mal wieder voll auf dem Schlauch.
Wie komme ich in der Schleife an die Methoden meiner Controls ohne die Schreibe für jedes Control neu bauen und aufrufen zu müssen? 😕

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Sclot,

warum verwendest du in deiner Methode nicht direkt Control.Enabled?

herbivore

S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren

Gute frage..
Dann müsste ich das enabled abfangen und umschreiben, so das in dem enabled dann geprüft wird ob das Control enabled sein soll oder nicht und es dann letztendlich setzen.

Hm.. müsste rein theoretisch funktionieren.

Trotzdem stellt sich mir die Frage noch, wie man eine Methode in seinen ganzen Controls aufrufen kann 😃

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Sclot,

du kannst doch eine (statische) Methode schreiben, die ein Control als Parameter bekommt und die dann entscheidet, ob Enabled oder nicht. Diese Methode kannst du als Delegat an die Rekursive Funktion übergeben.

herbivore

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

ich würde den von herbivore vorgeschlagenen Delegaten verwenden, wenn die Methode für unterschiedliche Controls immer gleich implementiert ist.

Andernfalls könntest Du Deine Controls auch ein eigenes Interface implementieren lassen, das nur die Methode "controls_lock" aufweist.
Dann könntest Du über

IMyInterface iCtl = control as IMyInterface;
if(iCtl != null)
{
  iCtl.controls_lock(...);
}

die Methode direkt aufrufen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren

OKay - das mit dem interface funktioniert 😃

Jetzt stellt sich mir noch mal ne andere frage (ich bekomm jetzt bestimmt wieder ärger weil ich dafür keinen neuen thread auf mache).

Ist es Performace- und Ressourcen-Technisch sinnvoller alle Controls in einer schleife durch zu gehen, oder sollte man versuchen in den controls ein event zu registrieren, so dass die Controls von sich aus ihren Zustand ändern können ohne das ich sie in einer Schleife durchgehen muss?

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Sclot,

das kommt immer darauf an. Wenn du jeder Änderung sofort mitbekommen willst, solltest du Events verwenden. Wenn du den Zustand nur zu einem bestimmten Zeitpunkt wissen willst, besser die Controls abzufragen.

Zu diesem Ergebnis kommt vielleicht auch wegen der Performance, vor allem aber wegen des sinnvollen und verständlichen Programmaufbaus.

herbivore