Autor Beitrag
Gernot
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 10.10.08 06:50 
hi. folgende frage:

ich baue ein framework für applikationen, bei denen sich der kunde aus verschiedenen user-interface-klassen (die alle von einer basis-klasse erben) den bildschirm selbst gestalten kann. eine user-interface-klasse ist in der regel immer ein formular mit der anzeige verschiedener daten und gekapselt dazu die möglichen funktionen (neu, ändern, ...).
ich hole dann zur laufzeit aus der datenbank die konfiguration für den user und möchte nun die einzelnen objekte aus den klassen lt. datenbank anlegen.
ich möchte jetzt aber nicht ein switch machen mit einem NEW statement für jede mögliche klasse, sondern eigentlich nur ein NEW bei dem ich die klasse dynamisch angebe. z.B.:

<<<alt>>>
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
switch (dataFormType)
    {
        case "Customer":
        {
            newUIC = new K3.Base.UserManagement.uicUser();
            break;
        }
        case "Order":
        {
            newUIC = new K3.Base.UserManagement.uicCustomer();
            break;
        }
        ...
    }


<<<ziel>>>
ausblenden C#-Quelltext
1:
2:
String className = "uicUser";
newUIC = new value(className)();


der vorteil dieser lösung ist, dass ich, wenn ich neue klassen baue (bzw. z.b. externe firmen eigene klassen bauen, die ich gar nicht kenne), diese ohne änderung im source-code jederzeit starten kann. zwar wird dann erst zur laufzeit kontrolliert, ob das überhaupt funktioniert (wenn z.B. die klasse eigentlich gar nicht zu meiner architektur passt), aber dafür bin ich viel flexibler.

die frage ist jetzt, ob so was überhaupt möglich ist und falls ja, wo ich dazu hints finden kann...

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Gernot Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 10.10.08 08:52 
hi leute.
hat sich erledigt, nach ein bisserl rumprobieren:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
using System.Reflection;
using System.Threading;
using System.Windows.Forms;

namespace K3.Base.UIManagement
{
    class UICFactory
    {
        public UIControl createUIC(String assemblyName, String fullUicName, String newUicID, Form newParentForm)
        {
            Type uicType = Type.GetType(fullUicName, truetrue);
            Object[] param = new Object[] { newUicID, newParentForm };
            UIControl uicObj = (UIControl)Activator.CreateInstance(uicType, param);

            return uicObj;
        }
    }
}


wobei:
alle klassen, die verwendet werden, vom typ UIControl abgeleitet sind.
der konstruktor jeder dieser klassen genau 2 parms erwartet (String newUicID und Form newParentForm)
und derzeit noch keine klassen anderer assemblies unterstützt werden, aber das wird dann auch keine hexerei mehr sein...

danke trotzdem...
gernot

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt