« Joseph Albahari .... | Main| Wiederverwendung .... »

Wenn man Code oft oder ähnlich schreibt, dann ...

10
Kategorie  
ist es Zeit sich Gedanken zu machen, wie man es mit weniger Aufwand machen könnte.... So zumindest der Plan...

Wer schon ab und an ein Consolen-Program in C# geschrieben hat, der hat sicher ein paar Parameter in die sog. App-Config ausgelagert und diese beim Starten des Programmes ausgelesen.
    class Program {
        public staticint iMax = 0;
        public staticstring sText = "JJR";
        static void Main(string[] args) {
            iMax =  Convert.ToInt32(ConfigurationManager.AppSettings"iMax");            
            sText =  ConfigurationManager.AppSettings"sText";
            Console.WriteLine("iMax - " + iMax);
            Console.WriteLine("sText - " + sText);
        }
    }
zumindest so oder ähnlich sieht es dann aus.
nach einiger Zeit kommt man evtl. auf die Idee die Konfigurationswerte in einer eigenen Methode auszulagern, welche dann so aussehen könnte ->
staticvoid ReadConfigValuesNormal() {
            string s = null;
            s = ConfigurationManager.AppSettings"iMax";
            iMax = (s != null) ? Convert.ToInt32(s) : iMax;
            s = ConfigurationManager.AppSettings"sText";
            sText = s ?? sText;      
        }
Hier wird halt erst noch geprüft, ob der Wert überhaupt in der App.Config drinnen steht, bevor er mit null überschrieben wird.
Dies hat den Vorteil, dass man in der / den Testumgebung/en einfach die Config weglässt und es funktioniert.
Im Produktiv-System einfach die Config dazu und gut.....

Und so kann es dann per Reflection aussehen ->

        static void ReadConfigValuesReflection() {
            FieldInfo[] fi = MethodInfo.GetCurrentMethod().ReflectedType.GetFields();          
            foreach (FieldInfo info in fi) {
                string s = ConfigurationManager.AppSettings[info.Name];
                if (s!=null) {
                    switch(info.FieldType.ToString()) {
                    case"System.String" :
                                info.SetValue(null,s);
                            break;
                    case"System.Int32" :
                                info.SetValue(null,Convert.ToInt32(s));
                            break;
                    }
                }
            }            
        }

Man muß die Felder in der Klasse einfach nur schön benennen, so dass es in der AppConfig auch Sinn macht und schon ist man durch.....

Das ganze kann man natürlich so erweitern, dass man in der AppConfig einfach den vollen Klassennamen angibt, dann wird es ein wenig flexibler ->
staticvoid ReadConfigValuesReflectionFullname() {
            Type t = MethodInfo.GetCurrentMethod().ReflectedType;
            FieldInfo[] fi = t.GetFields();              
            foreach (FieldInfo info in fi) {                
                string s = ConfigurationManager.AppSettings[t.FullName+"."+info.Name];
                if (s!=null) {
                    switch(info.FieldType.ToString()) {
                    case"System.String" :
                                info.SetValue(null,s);
                            break;
                    case"System.Int32" :
                                info.SetValue(null,Convert.ToInt32(s));
                            break;
                    }
                }
            }            
        }

Gruß JJR
P.S.: Anbei die cs und config

Kommentare

Gravatar Image1 - Hallo Jörg,

ist schon eine schöne Sache die du da angefangen hast Emoticon Was mir noch einfallen würde um es auch im Code etwas lesbarer und leichter ersichtlich zu machen was genau aus der Config kommt: ein Attribut an die betreffenden Felder ranmachen, so in etwa...

[Configured("MaxValue")]
public static int iMax = 0;

[Configured("Text")]
public static string sText = "JJR";

Die Auslesemethode dann noch so erweitern dass nur noch alle Member mit dem Attribut gesetzt werden. Da sieht jeder was aus der AppConfig geladen wird und man kann dem Attribut sogar noch den Schlüssel des Eintrages in der AppConfig als Parameter mitgeben. Evt. auch hilfreich wenn man öfters mal mit Newbies zusammen arbeitet... Emoticon

Nun habe ich da mal ein Beispiel gemacht für statische Felder und sehe gerade dass ich ja gar keine Dateien an den Kommentar ranmachen kann Emoticon

Aber ich denke du verstehst meinen Vorschlag auch so Emoticon

Viele Grüße,
Sebastian


P.S.: was man mit Reflection alles machen kann ist schon genial - und dann dazu noch Convert.ChangeType und man kann sich sogar das switch für den Type sparen

Gravatar Image2 - Hallo Sebastian,

die Convert.ChangeType kannte ich noch nicht, sollte doch ab und an mal Doku lesen Emoticon

Das Beispiel kannste mir ja mal senden, dann werde ich es unter Deinem Namen posten...

Gruß JJR
P.S.: Schreibe niemals Code, den auch jemand anders schreiben kann Emoticon

Mach einen Kommentar

:-D:-o:-p:-x:-(:-):-\:angry::cool::cry::emb::grin::huh::laugh::lips::rolleyes:;-)

Amazon


Impressum

Firmenname: Peanuts-Soft
Straße Nummer: Biinger Strasse 8
PLZ Ort: 55263 Wackernheim
Telefon: +491772134526
E-Mail: joerg.reck @ peanuts-soft.de
Disclaimer: Peanuts-Soft übernimmt keine Garantie dafür, dass die auf dieser Website bereitgestellten Informationen vollständig, richtig und stets aktuell sind. Dies gilt auch für alle Links, auf die verwiesen wird. Peanuts-Soft ist für die Inhalte, auf die per Link verwiesen wird, nicht verantwortlich. Peanuts-Soft haftet nicht für konkrete, mittelbare und unmittelbare Schäden oder Schäden, die durch fehlende Nutzungsmöglichkeiten, Datenverluste oder entgangene Gewinne – sei es aufgrund der Nichteinhaltung vertraglicher Verpflichtungen, durch Fahrlässigkeit oder eine andere unerlaubte Handlung – im Zusammenhang mit der Nutzung von Dokumenten oder Informationen bzw. der Erbringung von Dienstleistungen entstehen, die auf dieser Web Site zugänglich sind.
Datenschutz: Inhalt und Gestaltung der Internetseiten sind urheberrechtlich geschützt. Eine Vervielfältigung der Seiten oder deren Inhalte bedarf der vorherigen schriftlichen Zustimmung von Peanuts-Soft.


Locations of visitors to this page

Powered By

Domino BlogSphere
Version 3.0.2