Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何替换电子邮件模板中的所有值?_C#_.net_Replace - Fatal编程技术网

C# 如何替换电子邮件模板中的所有值?

C# 如何替换电子邮件模板中的所有值?,c#,.net,replace,C#,.net,Replace,我有一个电子邮件模板 比如这个 你好@FirstName@@LastName@ 我有一个对象,它来自一个具有属性的参数 我需要迭代所有对象属性,并用属性值替换所有与用“”引用的属性名称匹配的单词 例如,我有一个名为FirstName和LastName的对象,我需要迭代这个对象属性并在电子邮件中更改@FirstName@和@LastName@ 我试着写这个方法 private string ReplaceTemplateValues(object input, string emailTempla

我有一个电子邮件模板

比如这个

你好@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)中获取属性值


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

我建议以另一种方式处理它:在模板字符串中查找
@…
,并用输入对象中的值替换它。如果模板中碰巧有
@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 "";
    });
}
private string ReplaceTemplateValues(对象输入,字符串emailTemplate)
{
返回Regex.Replace(emailTemplate,@“@(?\w+@”),m=>
{
var property=input.GetType().GetProperty(m.Groups[“prop”].Value);
if(属性!=null)
{
var value=property.GetValue(输入);
if(值!=null)
返回值.ToString();
}
返回“”;
});
}
正则表达式的解释(另请参见)

  • @
    将匹配文字“@”
  • (?\w+
    将至少匹配一个(即
    +
    ,请参阅)“单词字符”(即
    \w
    ,请参阅-我假设您的属性名称是这样表示的),并将结果放入名为“prop”的组中(请参阅)
  • @
    将匹配另一个文本“@”

m.Groups[“prop”].Value
将为您获取匹配的组,即属性名称。

就我个人而言,我使用的是此类内容(还有一个非核心版本,IIRC)。我不想使用Razor,我只需要替换并返回替换后的字符串@uwekeim即可获得值:
property.GetValue(input)
它会返回字符串吗?我猜no@KlausGütterIt将返回属性的任何数据类型-您可以对返回的值调用
.ToString()
。据我所知,如果找不到属性,它将返回空值?不理解这种结构
(m.Groups[“prop”].Value)
,它是如何工作的?以及
(?\w+)
正则表达式是如何工作的。还添加了一些关于regex的解释。似乎
var属性
总是空的,当我发送这个对象时
{“FirstName”:“Eugene”,“LastName”:“Sukhomlyn”}
这是一个JSON表示,你的C#类看起来怎么样?