2009-03-25 13 views
0

Ich erstelle einen einfachen Code-Generator mit Delegierten.Was ist falsch an dieser Verwendung von Prädikat/CreateDelegate?

Warum erhalte ich diesen Fehler zur Laufzeit:

Fehler bei der Zielmethode verbindlich.

auf den folgenden Code?

XAML:

<Window x:Class="Parser.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Loaded="Window_Loaded" 
    Title="Parser" Height="600" Width="800"> 

     <TextBox x:Name="Output" 
       VerticalScrollBarVisibility="Visible" 
       Margin="10"/> 
</Window> 

-Code-Behind:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows; 

namespace Parser 
{ 
    public partial class Window1 : Window 
    { 
     private List<string> _fields; 

     public Window1() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      _fields = new List<string> { "CustomerID", 
       "CompanyName", 
       "ContactName", 
       "ContactTitle", 
       "Address", 
       "City", 
       "Region", 
       "PostalCode", 
       "Country", 
       "Phone", 
       "Fax" 
      }; 

      Output.Text += ParseFieldsWithMethod("BuildAssignmentLines"); 
      Output.Text += ParseFieldsWithMethod("BuildEnabledLines"); 
     } 

     private string ParseFieldsWithMethod(string theParseMethod) 
     { 
      Predicate<string> predicate = (Predicate<string>)Delegate.CreateDelegate(typeof(Predicate<string>), 
       typeof(Window1).GetMethod(theParseMethod)); 

      StringBuilder sb = new StringBuilder(); 
      foreach (var field in _fields) 
      { 
       sb.Append(predicate.Invoke(field)); 
      } 
      return sb.ToString(); 
     } 

     public string BuildAssignmentLines(string field) 
     { 
      return String.Format("customer.{0} = Field_{0}.Text;\n", field); 
     } 

     public string BuildEnabledLines(string field) 
     { 
      return String.Format("Field_{0}.IsEnabled = false;\n", field); 
     } 

    } 
} 

Antwort

7

Prädikat ist eine Funktion, die eine Zeichenfolge als Parameter akzeptiert und einen booleschen Wert zurückgibt. Ihre Zeilen zurückgeben.

Sie sollten Funktion anstelle von Prädikat verwenden.

Auch sollten Sie die Funktion wirklich als Parameter und nicht nach Name senden.

ParseFieldsWithMethod(x => BuildAssignmentLines(x)); 
ParseFieldsWithMethod(x => BuildEnabledLines(x)); 


private string ParseFieldsWithMethod(Func<string, string > parseMethod) 
{ 
      StringBuilder sb = new StringBuilder(); 
      foreach (var field in _fields) 
      { 
       sb.Append(parseMethod(field)); 
      } 
      return sb.ToString(); 
     } 
+0

Noch einfacher können Sie aufrufen: ParseFieldsWithMethod (BuildAssignmentLines); :) – eglasius

+0

verdammt. Ich sollte ein C# eines Tages versuchen :) (VB Typ hier) –

2

Prädikate Rückkehr bool - Sie Rückkehr string. Sieht aus, als ob Sie Func<string,string> anstelle von Predicate<string> möchten. (Oder ändern Sie die Rückgabetypen und Ausdrücke dieser Methoden.)

Verwandte Themen