2009-03-25 6 views
0

Je crée un générateur de code simple avec des délégués.Quel est le problème avec cette utilisation de Predicate/CreateDelegate?

Pourquoi ai-je cette erreur lors de l'exécution:

Erreur lors de la liaison de la méthode cible.

sur le code suivant?

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); 
     } 

    } 
} 

Répondre

7

Predicate est une fonction qui prend une chaîne en tant que paramètre et renvoie une valeur booléenne. Vos cordes de retour.

Vous devez utiliser Fonction au lieu de Prédicat.

De même, vous devriez vraiment envoyer la fonction en tant que paramètre et non par son nom.

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

Encore plus simple, vous pouvez appeler: ParseFieldsWithMethod (BuildAssignmentLines); :) – eglasius

+0

putain. Je devrais essayer du C# un jour :) (VB gars ici) –

2

prédicats retour bool - vous retournez string. On dirait que vous voulez Func<string,string> au lieu de Predicate<string>. (Ou modifiez les types de retour et les expressions de ces méthodes.)

Questions connexes