MatchEvaluator给出“不能使用lambda表达式...”错误

时间:2017-07-09 20:44:10

标签: c# regex lambda delegates matchevaluator

我正在修改几个文件的内容。我在表格中有这个正则表达式,它直接从按钮的点击事件中调用。

public partial class MainForm : Form
{
    private void UpdateButton_Click(object sender, EventArgs e)
    {
        // code

        if (!OldURLBox.Text.IsEmpty() && !NewURLBox.Text.IsEmpty())
        {
            Regex patternURL = new Regex(string.Format("s:\\d+:\\\\\"((.(?!s:\\d+))*?){0}(.*?)\\\\\";", OldURL));
            content = patternURL.Replace(content, delegate(Match m) // works fine
            {
                var prefix = m.Groups[1].Value;
                var postfix = m.Groups[3].Value;
                var length_prefix = prefix.Replace("\\n", "$").Length;
                var length_postfix = postfix.Replace("\\n", "$").Length;
                var length_total = length_prefix + NewURL.Length + length_postfix;
                return string.Format("s:{0}:\\\"{1}{2}{3}\\\";", length_total, prefix, NewURL, postfix);
            });
        }

        // code
    }
}

这很好用。我已将此代码(正则表达式替换)移动到另一个项目并收到以下错误:

  

如果没有先将lambda表达式转换为委托或表达式树类型,则不能将lambda表达式用作动态调度操作的参数

我没有直接在事件函数中调用正则表达式替换,我想这就是导致错误的原因。我不知道如何解决它。检查以下代码。这是我正在使用的结构。省略了不成功的部分。

public partial class ProgressForm : Form
{
    private void ProgressForm_Load(object sender, EventArgs e)
    {
        // when run without delay, it freezes, waits for targz extraction
        System.Timers.Timer timer = new System.Timers.Timer(500);
        timer.Elapsed += (sender2, e2) => OnTimedEvent(sender2, e2);
        timer.AutoReset = false;
        timer.Enabled = true;
    }

    private void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        this.BeginInvoke((MethodInvoker)delegate
        {
            if (File.Exists(Template.File.ArchiveTarGz))
            {
                // code; extract files from archive

                ModifyFiles();

                // code; repack files
            }
        });
    }

    private void ModifyFiles()
    {
        // code

        Regex patternURL = new Regex(string.Format("s:\\d+:\\\\\"((.(?!s:\\d+))*?){0}(.*?)\\\\\";", Template.Website.URL));
        DBText = patternURL.Replace(DBText, delegate(Match m) // Error: Cannot use a lambda expression as an argument ...
        {
           var prefix = m.Groups[1].Value;
           var postfix = m.Groups[3].Value;
           var length_prefix = prefix.Replace("\\n", "$").Length;
           var length_postfix = postfix.Replace("\\n", "$").Length;
           var length_total = length_prefix + UserInput.Website.URL.Length + length_postfix;
           return string.Format("s:{0}:\\\"{1}{2}{3}\\\";", length_total, prefix, UserInput.Website.URL, postfix);
        });

        // code
    }
}

这可能是重复的,因为这个确切的错误还有其他问题,但我找不到我可以在我的代码中实现的东西。

有人可以将标题更改为更合适的标题。我不希望标题成为错误,因为已存在几个问题。

1 个答案:

答案 0 :(得分:0)

您正在替换DBText的内容。 Regex.replace将字符串作为第一个参数。我猜测DBText属于动态类型,这使得编译器在这种特殊情况下感到困惑。

你可以简单地将DbText强制转换为字符串,你应该没问题

$ echo "1 2 3" |awk '{print}'
1 2 3