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



BeitragVerfasst: Mi 21.12.11 12:15 
Hallo,

ich bin auf der Suche nach einer Möglichkeit die Settings dynamisch auszulesen und zu verarbeiten. D.h. alle Informationen und Einstellungen sollen aus einer Konfigurationsdatei gelesen und verarbeitet werden. Dabei könnte sich die Menge und der Name ändern, deshalb brauch ich das möglichst dynamisch

Nun habe ich folgendes zusammengebastelt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Object prop = Properties.standort.Default.Properties;

Type ty = prop.GetType();

PropertyInfo[] propertyInfos = ty.GetProperties();

foreach (PropertyInfo propertyInfo in propertyInfos) {

        String message = (String)propertyInfo.GetValue(prop, null);

        MessageBox.Show(message);
}


Wenn ich diesen Code ausführe bekomme ich einen Parameteranzahlkonflikt.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Fehlermeldung:
bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
bei System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
bei System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
bei Support.Form1..ctor() in C:\Dokumente und Einstellungen\user\Eigene Dateien\Visual Studio 2010\Projects\Support\Support\Form1.cs:Zeile 99.
bei Support.Program.Main() in C:\Dokumente und Einstellungen\user\Eigene Dateien\Visual Studio 2010\Projects\Support\Support\Program.cs:Zeile 18.
bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()

Was habe ich falsch gemacht?

Ich hab Google viel beansprucht und viele Foren durchforstet aber leider nie etwas richtiges gefunden.

Gibt es eine einfachere und leichtere Lösung für das Problem?

Vielen Dank im Voraus!

Moderiert von user profile iconTh69: Beitragsformatierung überarbeitet.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 21.12.11 13:44 
Reden wir hier von den Properties einer ApplicationSettingsBase Klasse? Dann ist Properties eine Collection über die du einfach per foreach iterieren kannst. Es gibt also keinen Grund für Reflection da das eh nicht dynamisch ist. Per Reflection würdest du ja nur die Properties der Collection auslesen also sowas wie Count etc. die du auch einfach so abragen würdest.

Knallen wird dein Code weil du alle Properties abfragst also zum Beispiel auch den Array Indexer der Properties Collection. Und da mußt du dann auch zwingend einen Index bei GetValue mit übergeben und nicht null als 2.ter Parameter.

Für diesen Beitrag haben gedankt: efflicto
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 21.12.11 13:47 
Hallo und :welcome:

du hattest bei myCSharp ja schon diese Frage gestellt: Parameteranzahlkonflikt bei PropertyInfo.GetValue
Hat dir die Antwort von herbivore nicht weitergeholfen? Hast du denn den Nachsatz vom ihm schon gelesen:
Zitat:

PS: Hier noch eine Ergänzung aufgrund eines Hinweises von xxMUROxx:

Mit propertyInfo.GetIndexParameters().Length kann man die Anzahl der Parameter, die die Property (genauer: der Indexer) erwartet, bestimmen.

Wenn es sich also um einen Indexer handelt (d.h. Length > 0), solltest du ihn entweder ignorieren oder aber korrekte Indexparameter übergeben (wobei es schwierig sein wird, die gültigen Parameter herauszufinden).

P.S. Der Hinweis von Ralf Jansen ist natürlich vorzuziehen, falls es sich wirklich um den Zugriff auf die Application-Settings handelt.

Für diesen Beitrag haben gedankt: efflicto
efflicto Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 21.12.11 14:02 
Hallo, zusammen und danke für das Willkommen :)

Also ich möchte eine einfach anpassbare Konfig über die ich bestimmte Parameter festlegen kann die mal mehr oder weniger vorkommen können.

Der Beitrag hat mir nur teilweise geholfen, aber hat mit auf den User xxMUROxx aufmerksam gemacht. Mit ihm bzw durch ihn bin ich auf diese Lösung gekommen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
object prop = Properties.Settings.Default;

            var v = new List<object>();
            var vv = prop.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
            
                {
                foreach (var propertyInfo in vv) {

                    v.Add(propertyInfo.GetValue(prop, null));
                   textBox1.Text +=propertyInfo.GetValue(prop, null).ToString(); // zum Test
                   textBox1.Text += "\r\n";// zum Test
                    }
                }


Damit kann ich aus Properties.Settings.Default die in der Programm.exe.config Datei festgelegt sind meine Daten abrufen und weiterverarbeiten. Es funktioniert :)

Gibt es noch andere Möglichkeiten?


Danke für die Antworten und liebe Grüße
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 22.12.11 00:18 
Zitat:
Gibt es noch andere Möglichkeiten?


Wie gesagt das hier überflüssige Reflection weglassen. Es gibt einen ~vorgesehen~ Weg wie man an die Properties kommt.

ausblenden C#-Quelltext
1:
2:
3:
4:
foreach (SettingsProperty property in Properties.Settings.Default.Properties)
{
    textBox1.Text += property.Name + " = " + property.DefaultValue.ToString();            
}