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

目前我有这个方法:


 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像现在这样在这里使用,但有可能以其他方式实现吗?谢谢!


慕运维8079593
浏览 106回答 1
1回答

12345678_0001

假设有一个全局replacements struct(??) 并假设未指定类型,您可以传入一个 lambda 来指定要调用的成员方法。public void CreatePart(Func<ReplacementMap, Dictionary<string, string>> getReplacementMap) {&nbsp; &nbsp; CreateTextPart("DefaultText.txt",&nbsp; &nbsp; &nbsp; &nbsp; (string text) => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var mapd = getReplacementMap(replacements);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Regex regex = new Regex(string.Join("|", mapd.Keys.Select(x => Regex.Escape(x))));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string replaced = regex.Replace(text, m => mapd[m.Value]);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return replaced;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; );}然后你只需调用CreatePart每个部分:public void CreateTextFile() {&nbsp; &nbsp; CreatePart(r => r.DefaultText());&nbsp; &nbsp; CreatePart(r => r.RedText());&nbsp; &nbsp; CreatePart(r => r.EndText());}但是,当您可以直接传入方法调用结果时,为什么要这样做呢?public void CreatePart(Dictionary<string, string> mapd) {&nbsp; &nbsp; CreateTextPart("DefaultText.txt",&nbsp; &nbsp; &nbsp; &nbsp; (string text) => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Regex regex = new Regex(string.Join("|", mapd.Keys.Select(x => Regex.Escape(x))));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string replaced = regex.Replace(text, m => mapd[m.Value]);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return replaced;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; );}public void CreateTextFile() {&nbsp; &nbsp; CreatePart(replacements.DefaultText());&nbsp; &nbsp; CreatePart(replacements.RedText());&nbsp; &nbsp; CreatePart(replacements.EndText());}
打开App,查看更多内容
随时随地看视频慕课网APP