2009-03-25 12 views
0

私はデリゲートを使って簡単なコードジェネレーターを作成しています。この述語/ CreateDelegateの使用で何が問題になりますか?

は、なぜ私は、実行時にこのエラーを取得しています:

エラーをターゲットメソッドをバインド中。

次のコードにありますか?

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> 

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

    } 
} 

答えて

7

述語は、文字列をパラメータとして受け取り、ブール値を返す関数です。 あなたの文字列が返されます。

述語の代わりに関数を使用する必要があります。

また、実際には名前ではなくパラメータとして関数を送信する必要があります。

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

さらに簡単に、次のものを呼び出すことができます。ParseFieldsWithMethod(BuildAssignmentLines); :) – eglasius

+0

。 私はある日C#を試してみるべきです:)(ここVBの人) –

2

述語はboolを返す - あなたはstringを返します。 Predicate<string>の代わりにFunc<string,string>が必要なようです。 (またはそれらのメソッドの戻り値の型と式を変更してください)

関連する問題