System.Reflection.TargetParameterCountException: "Parameteranzahlkonflikt."

    • Allgemein

    Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Thunderbolt.

      System.Reflection.TargetParameterCountException: "Parameteranzahlkonflikt."

      Wenn eine Prozedur mit einem String-Array als Parameter mit BeginInvoke() aufgerufen wird, kommt es (gelegentlich) reproduzierbar zu einer
      System.Reflection.TargetParameterCountException: "Parameteranzahlkonflikt."

      @Kraizy hatte das Problem: Möglichkeit ohne TryCatch?
      @Pixxxas hatte das Problem: Datei aus Ressourcen starten
      Ich selbst hatte das Problem auch eben.

      Ob das generell so ist, kann ich nicht sagen.

      Gibt man der Zielprozedur eine String-List als Parameter, funktioniert BeginInvoke().
      Auch wenn die Zielprozedur einen zusätzlichen Dummy-Parameter bekommt, funktioniert BeginInvoke().

      C#-Quellcode

      1. string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
      2. Action<List<string>> action = new Action<List<string>>(this.ReadFiles);
      3. this.ReadFiles(files.ToList());
      4. private void ReadFiles(List<string> files)
      5. {
      6. // ...
      7. }
      Wahrscheinlich liegt es am String-Array als einzigem Parameter.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

      RodFromGermany schrieb:

      Ob das generell so ist, kann ich nicht sagen.
      Ist es und ich kann lösen: BeginInvoke (oder auch Invoke) kann man Parameter für die aufgerufene Methode mitgeben, und zwar als params-Array. Die sind aber nur syntaktischer Zucker für „erzeuge ein Array und belege den params-Array-Parameter damit.“ Beispiel:

      C#-Quellcode

      1. void Test(params string[] args)
      2. {
      3. Console.WriteLine("Called with:");
      4. foreach (var o in args)
      5. {
      6. Console.WriteLine(" {0}", o);
      7. }
      8. }
      9. Test();
      10. Test("A");
      11. Test("A", "B", "C");
      12. Test(new string[]{});
      13. Test(new string[]{"1"});
      14. Test(new string[]{"1", "2", "3"});


      Wenn man also ein Array als Eingabe leistet, wird dieses Array nicht als Array weitergegeben, sondern es wird versucht, die Elemente auf die Parameter der invokten Methoden zu entpacken. Legt allerdings noch einen Dummy-Parameter dazu, wird Dummy-Parameter und Eingabe-Array in das params-Array verpackt. Mit List funktioniert es, weil List nach außen kein Array ist.
      Mit freundlichen Grüßen,
      Thunderbolt