【问题标题】:How to replace all values in email template?如何替换电子邮件模板中的所有值?
【发布时间】:2021-04-27 14:48:47
【问题描述】:

我有一个电子邮件模板

例如这个

你好@FirstName@ @LastName@

我有一个来自具有属性的参数的对象

我需要迭代所有对象属性,并将与用“”引用的属性名称匹配的所有单词替换为属性值。

因此,例如,我有一个包含 FirstName 和 LastName 的对象,我需要迭代此对象属性并更改电子邮件中的 @FirstName@ 和 @LastName@。

我试着写这个方法

private string ReplaceTemplateValues(object input, string emailTemplate)
{
    foreach(var property in input.GetType().GetProperties())
    {
        var replacedTemplate = emailTemplate.Replace($"@{property.Name}@", property);
    }
}

但是我如何在var replacedTemplate = emailTemplate.Replace($"@{property.Name}@", property); 中获取属性值

并返回整个替换的字符串?

【问题讨论】:

  • 就我个人而言,我使用Razor Engine Core 来处理这些事情(还有一个非核心版本,IIRC)。多年来成功使用它。
  • 我不想使用 Razor,我只需要替换并返回替换字符串 @UweKeim
  • 获取价值:property.GetValue(input)
  • 它会返回字符串吗?我猜没有@KlausGütter
  • 它会返回属性的任何数据类型——你可以在返回值上调用.ToString()

标签: c# .net replace


【解决方案1】:

我建议反过来运行它:在模板字符串中查找@...@ 并将其替换为输入对象中的值。如果您碰巧在模板中有 @X@ 但没有属性 X,这也会表现得很好。

要从模板中提取属性名称,可以使用正则表达式:

private string ReplaceTemplateValues(object input, string emailTemplate)
{
    return Regex.Replace(emailTemplate, @"@(?<prop>\w+)@", m =>
    {
        var property = input.GetType().GetProperty(m.Groups["prop"].Value);
        if (property != null)
        {
            var value = property.GetValue(input);
            if (value != null)
                return value.ToString();
        }
        return "";
    });
}

正则表达式的解释(另见documentation

  • @ 将匹配文字“@”
  • (?&lt;prop&gt;\w+) 将匹配至少一个(即+,请参阅quantifiers)“单词字符”(即\w,请参阅character classes - 我假设您的属性名称是这样表示的)并将生成一个名为“prop”的组(请参阅named subexpressions
  • @ 将匹配另一个文字“@”

m.Groups["prop"].Value 将为您提供匹配的组,即属性名称。

【讨论】:

  • 据我了解,如果找不到该属性,它将返回一个空值?而且不明白(m.Groups["prop"].Value)这个构造,它是如何工作的?
  • 是的。还添加了一些关于正则表达式的解释。
  • 似乎var property 总是为空,当我发送这个对象{"FirstName" : "Eugene" , "LastName": "Sukhomlyn"}
  • 这是一个 JSON 表示,你的 C# 类是什么样子的?
猜你喜欢
  • 2019-03-03
  • 1970-01-01
  • 2014-03-01
  • 2012-03-31
  • 2018-11-10
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2012-03-04
相关资源
最近更新 更多