【问题标题】:What is wrong with this use of Predicate / CreateDelegate?使用 Predicate / CreateDelegate 有什么问题?
【发布时间】:2009-03-25 15:26:32
【问题描述】:

我正在创建一个带有委托的简单代码生成器。

为什么我在运行时收到此错误:

绑定目标方法时出错。

在下面的代码上?

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

    }
}

【问题讨论】:

    标签: c# delegates predicate


    【解决方案1】:

    Predicate 是一个将字符串作为参数并返回布尔值的函数。 你的返回字符串。

    你应该使用函数而不是谓词。

    另外,您应该真正将函数作为参数而不是按名称发送。

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

    【讨论】:

    • 更简单,可以调用:ParseFieldsWithMethod(BuildAssignmentLines); :)
    • 该死的。有一天我应该尝试一些 C# :) (这里是 VB 人)
    【解决方案2】:

    谓词返回bool - 你返回string。看起来您想要Func&lt;string,string&gt; 而不是Predicate&lt;string&gt;。 (或者更改这些方法的返回类型和表达式。)

    【讨论】:

      猜你喜欢
      • 2020-10-11
      • 1970-01-01
      • 2012-01-29
      • 2011-03-08
      • 2011-01-09
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 2018-10-13
      相关资源
      最近更新 更多