目前,我有这种方法:
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
,但是是否可以通过其他方式实现?
谢谢!
答案 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());
}