2013-10-20 183 views
1

我有以下幾點:如何「發送」一種方法到另一種方法?

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(".")); 

當翻譯將是我「傳遞」給它的方法。

比你多, 米格爾

+0

我建議像什麼呢白話:靜態類與翻譯方法。如果你不能改變這種情況,請將委託作爲參數傳遞給模糊處理:public String Obfuscate(String email,Func translator) – Eregrith

+0

這正是代表的用途。你可以使用Func。但我相信,應該有更優雅的方式。 –

回答

2

我認爲@ 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 */ } 
} 
3

考慮不同的設計:

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。資源相關機制旨在處理翻譯。

相關問題