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

时间:2018-12-12 18:45:55

标签: c# .net methods struct

目前,我有这种方法:

 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 个答案:

答案 0 :(得分:1)

假设有一个全局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());
}