Что не так с таким использованием Predicate / CreateDelegate?

StackOverflow https://stackoverflow.com/questions/682102

  •  22-08-2019
  •  | 
  •  

Вопрос

Я создаю простой генератор кода с делегатами.

Почему я получаю эту ошибку во время выполнения:

Ошибка при привязке целевого метода.

по следующему коду?

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