如何将方法“发送”到另一个方法内?

时间:2013-10-20 14:11:29

标签: c#

我有以下内容:

public class Mail {
  public String Obfuscate(String email) {
    return email.Replace("@", "at").Replace(".", "dot");
  }
}

我在类中调用Obfuscate方法,如下所示:

public class Resolver {
  public Data GetData () {
    return new Data { Email = new Mail().Obfuscate(myEmail) };
  }
  public String Translate(string value) { /* Some Code */ }
}

问题是Obfuscate用英语替换:@>在, 。 >点

但是在Resolver类中,Translate方法正是我需要的......

如何将Translate方法“传递”到Obfuscate方法,以便这个方法使用它来翻译@和。以当前语言来点和点?

所以Obfuscate中的代码行:

return email.Replace("@", "at").Replace(".", "dot");

将成为:

return email.Replace("@", Translate("@")).Replace(".", Translate("."));

Translate将成为我“传递”它的方法。

比你, 米格尔

2 个答案:

答案 0 :(得分: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。资源相关机制旨在处理翻译。

答案 1 :(得分: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 */ }
}