为了账号安全,请及时绑定邮箱和手机立即绑定

我可以将方法名称参数传递给类或结构可以使用的方法吗?

我可以将方法名称参数传递给类或结构可以使用的方法吗?

C#
慕运维8079593 2022-06-12 10:58:13
目前我有这个方法: public void CreateDefaultTextPart(Func<string> methodName) {    CreateTextPart("DefaultText.txt", (string text)  =>    {        Regex regex = new Regex(string.Join("|", replacements.DefaultText().Keys.Select(x => Regex.Escape(x))));        string replaced = regex.Replace(text, m => replacements.DefaultText()[m.Value]);        return replaced;    }    ); }结构在哪里replacements。我有一堆相当相似的方法,唯一的区别是代码的一部分是replacement结构正在调用它的方法。因此,不必为CreateTextPart结构中的每个方法重复该方法,我只想调用一个通用方法名称,如下所示:replacements.methodName()methodname()我传入的任何有效方法都可以在哪里,它存在于结构中。所以我可以methodname直接将参数传入CreateTextPart,而不是让多个方法做基本相同的事情。目前我正在调用这样的方法:  public void CreateTextFile()  {    CreateDefaultTextPart(SomeTestMethod); //"SomeTestMethod" is not used by any means here.    CreateRedTextPart();    CreateEndTextPart();  }如果可能的话,我想这样做: public void CreateTextFile()  {    CreateDefaultTextPart(DefaultText);    CreateDefaultTextPart(RedText);    CreateDefaultTextPart(EndText);  }生成的方法应如下所示:public void CreateDefaultTextPart(Func<string> methodName) {    CreateTextPart("DefaultText.txt", (string text)  =>    {        Regex regex = new Regex(string.Join("|", replacements.methodName().Keys.Select(x => Regex.Escape(x))));        string replaced = regex.Replace(text, m => replacements.methodName()[m.Value]);        return replaced;    }    ); }当然有一个更合适的名字。我知道我不能Func像现在这样在这里使用,但有可能以其他方式实现吗?谢谢!
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

假设有一个全局replacements struct(??) 并假设未指定类型,您可以传入一个 lambda 来指定要调用的成员方法。


public void CreatePart(Func<ReplacementMap, Dictionary<string, string>> getReplacementMap) {

    CreateTextPart("DefaultText.txt",

        (string text) => {

            var mapd = getReplacementMap(replacements);

            Regex regex = new Regex(string.Join("|", mapd.Keys.Select(x => Regex.Escape(x))));

            string replaced = regex.Replace(text, m => mapd[m.Value]);

            return replaced;

        }

    );

}

然后你只需调用CreatePart每个部分:


public void CreateTextFile() {

    CreatePart(r => r.DefaultText());

    CreatePart(r => r.RedText());

    CreatePart(r => r.EndText());

}

但是,当您可以直接传入方法调用结果时,为什么要这样做呢?


public void CreatePart(Dictionary<string, string> mapd) {

    CreateTextPart("DefaultText.txt",

        (string text) => {

            Regex regex = new Regex(string.Join("|", mapd.Keys.Select(x => Regex.Escape(x))));

            string replaced = regex.Replace(text, m => mapd[m.Value]);

            return replaced;

        }

    );

}


public void CreateTextFile() {

    CreatePart(replacements.DefaultText());

    CreatePart(replacements.RedText());

    CreatePart(replacements.EndText());

}


查看完整回答
反对 回复 2022-06-12
  • 1 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信