繁体   English   中英

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

[英]Can I pass a method-name parameter to a method that can be used by a class or 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()可以是我传入的任何有效方法,该方法存在于struct中。 因此,我可以将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 ,但是是否可以通过其他方式实现呢? 谢谢!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM