2008-10-27 3 views
2

У меня есть набор шаблонов для писем, отправляемых моим приложением. Шаблоны имеют встроенные в них коды, которые соответствуют свойствам моего бизнес-объекта.Расширение шаблона сообщения

Есть ли более элегантный способ, чем вызов

string.Replace("{!MyProperty!}", item.MyProperty.ToString()) 

зиллионы раз? Может быть, XMLTransform, регулярные выражения или какая-то другая магия? Я использую C# 3.5.

ответ

3

Прежде всего, когда я это делаю, я использую StringBuilder.Replace(), поскольку я обнаружил, что его производительность намного лучше подходит при работе с 3 или более заменами.

Конечно, есть другие способы сделать это, но я обнаружил, что обычно не стоит прилагать дополнительных усилий, чтобы попробовать другие предметы.

Возможно, вы сможете использовать Reflection, я думаю, автоматизировать замену, которая может быть единственным «лучшим» способом.

1

Вы можете сделать это с помощью регулярного выражения, но ваша замена регулярного выражения отличается также для каждого свойства. Я бы придерживался string.Replace.

Использование отражения для получения свойств и заменить его в цикле:

foreach (string property in properties) 
{ 
    string.Replace("{!"+property+"!}",ReflectionHelper.GetStringValue(item,property)); 
} 

Просто реализовать метод ReflectionHelper.GetStringValue и использовать отражение для получения всех свойств на вашем типе объекта элемента.

0
public class Template { 
    static Regex TAG_RE = new Regex(@"\{!(\w+)!}"); 

    public Template(object item) { 
     this.item = item; 
    } 

    private string resolver(Match match) { 
     string tag = match.Group[1]; 
     if (tag == "MyProperty") { 
      return item.MyProperty.toString(); 
     } 
     return ""; 
    } 

    public string translate(string text) { 
     return TAG_RE.Replace(text, new MatchEvaluator(this.resolver)); 
    } 
} 

(Там могут быть некоторые синтаксиса и/или семантические ошибки)

1

Там есть встроенный WebControl, System.Web.UI.WebControls.MailDefinition, что делает string replacements (среди прочего). Жаль, что они плотно связали его с настройками Smtp в app.config и веб-элементом управления, а затем сделали его запечатанным для наследования фольги.

Но он обрабатывает несколько вещей, которые, скорее всего, понадобятся в механизме почтового шаблона - основной текст из файла, html-адрес электронной почты, встроенные объекты и т. Д. Отражатель показывает, что фактическая замена обрабатывается с помощью цикла foreach и Regex.Replace - что кажется мне разумным выбором.

Быстрый просмотр показывает, что если вы можете жить с адресом, указанным в app.config (после этого вы можете изменить его на возвращаемом MailMessage), вам нужен только элемент управления владельца для встроенных ресурсов или BodyFileName.

Если вы используете ASP.NET или можете жить с ограничениями - я бы выбрал MailDefinition. В противном случае просто сделайте foreach над словарем и Regex.Replace. Это небольшая голодающая память из-за повторяющихся распределений тела - но они недолговечны и не должны представлять большую часть проблемы.

var replacements = new Dictionary<string, object>() { 
    { "Property1", obj.Property1 }, 
    { "Property2", obj.Property2 }, 
    { "Property3", obj.Property3 }, 
    { "Property4", obj.Property4 }, 
} 

foreach (KeyValuePair<string, object> kvp in replacement) { 
    body = Regex.Replace(body, kvp.Key, kvp.Value.ToString()); 
} 

Если у вас действительно есть много свойств, а затем прочитать ваше тело сначала Regex.Match и отражать в свойствах вместо этого.

Смежные вопросы