如何“发送”一种方法到另一种方法?
问题描述:
我有以下几点:如何“发送”一种方法到另一种方法?
public class Mail {
public String Obfuscate(String email) {
return email.Replace("@", "at").Replace(".", "dot");
}
}
我在一个类中调用该方法进行模糊处理,如下所示:
public class Resolver {
public Data GetData() {
return new Data { Email = new Mail().Obfuscate(myEmail) };
}
public String Translate(string value) { /* Some Code */ }
}
的问题是,模糊处理确实在英语置换:@>的。 >点
但在解析器类中的方法不翻译正是我需要的...
我怎样才能“通”的翻译方法将模糊处理方法,所以这一块用它来翻译@和。在当前的语言点和点?
所以里面混淆代码行:
return email.Replace("@", "at").Replace(".", "dot");
将成为:
return email.Replace("@", Translate("@")).Replace(".", Translate("."));
当翻译将是我“传递”给它的方法。
比你多, 米格尔
答
我认为@ BartoszKP的答案是正确的设计决策。为了完整性,以下是如何做你所问的。
更改邮件采取Func<string,string>
:
public class Mail {
public String Obfuscate(String email, Func<string,string> translate) {
return email.Replace("@", translate("at")).Replace(".", translate("dot"));
}
}
并通过您Translate
方法吧:
public class Resolver {
public Data GetData() {
return new Data { Email = new Mail().Obfuscate(myEmail, Translate) };
}
public String Translate(string value) { /* Some Code */ }
}
答
考虑不同的设计:
public interface ITranslator
{
string Translate(string s);
}
public class Obfuscator
{
public Obfuscator(ITranslator translator)
{
this.translator = translator;
}
public string Obfuscate(string email)
{
var at = translator.Translate("at");
var dot = translator.Translate("dot");
return email.Replace("@", at).Replace(".", dot);
}
private ITranslator translator;
}
public class EnglishTranslator : ITranslator
{
public string Translate(string s)
{
return s;
}
}
public class PolishTranslator : ITranslator
{
public PolishTranslator() //or `FileInfo dictionaryFile` parameter perhaps
{
// for simplicity
translations = new Dictionary<string, string>();
translations.Add("at", "malpa");
translations.Add("dot", "kropka");
}
public string Translate(string s)
{
return translations[s];
}
private Dictionary<string, string> translations;
}
但是你真的应该考虑使用ResourceManager
。资源相关机制旨在处理翻译。
我建议像什么呢白话:静态类与翻译方法。如果你不能改变这种情况,请将委托作为参数传递给模糊处理:public String Obfuscate(String email,Func translator) –
Eregrith
这正是代表的用途。你可以使用Func。但我相信,应该有更优雅的方式。 –