-2

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

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

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

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

4

1 回答 1

0

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

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

patternURL.Replace((string)DBText, (...)
于 2017-07-09T21:21:10.377 回答