ما الخطأ في استخدام Predicate/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);
}
}
}
المحلول
المسند هو دالة تأخذ سلسلة كمعلمة وترجع قيمة منطقية.لك سلاسل العودة.
يجب عليك استخدام الدالة بدلاً من المسند.
أيضًا، يجب عليك حقًا إرسال الوظيفة كمعلمة وليس بالاسم.
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();
}
نصائح أخرى
تعود المسندات bool
- أنت عائد string
.يبدو أنك تريد Func<string,string>
بدلاً من Predicate<string>
.(أو قم بتغيير أنواع الإرجاع وتعبيرات تلك الأساليب.)
لا تنتمي إلى StackOverflow