MatchEvaluator 给出 "Cannot use a lambda expression..." 错误

MatchEvaluator gives "Cannot use a lambda expression..." error

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

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

这工作正常。我已将此代码(正则表达式替换)移至另一个项目并收到以下错误:

Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type

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

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

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

谁能改个更合适的标题。我不希望标题是错误的,因为其中已经存在几个问题。

您正在替换 DBText 的内容。 Regex.replace 需要一个字符串作为第一个参数。我猜 DBText 是动态类型,在这种特殊情况下会混淆编译器。

您只需将 DbText 转换为字符串就可以了

patternURL.Replace((string)DBText, (...)