سؤال

أقوم بإنشاء منشئ أكواد بسيط مع المندوبين.

لماذا أتلقى هذا الخطأ في وقت التشغيل:

حدث خطأ أثناء ربط الطريقة المستهدفة.

على الكود التالي؟

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>.(أو قم بتغيير أنواع الإرجاع وتعبيرات تلك الأساليب.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top