[英]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.