C# 字符串插入到变量中

C# 字符串插入到变量中,c#,C#,我正在尝试使用c 6.0中的字符串插值将人名作为动态值插入电子邮件正文中 概念证明 此概念验证输出字符串: 信息:约翰说“你好,世界!” 实施 所以现在,当我尝试使用这个概念来构建邮件消息时,我在电子邮件中得到了{Contact.FirstName}输出。代码如下: private string _Body; public string Body { get { return _Body; } set { _Body = value; Ra

我正在尝试使用c 6.0中的字符串插值将人名作为动态值插入电子邮件正文中

概念证明 此概念验证输出字符串:

信息:约翰说“你好,世界!”

实施 所以现在,当我尝试使用这个概念来构建邮件消息时,我在电子邮件中得到了{Contact.FirstName}输出。代码如下:

private string _Body;
public string Body
{
    get { return _Body; }
    set
    {
        _Body = value;
        RaisePropertyChangedEvent("Body");
    }
}

var Contacts = Context.Contacts
  .Where(x => x.ContactGroupId == ContactGroupId && x.Deleted == false);

// By this point, Body will already have a value containing the interpolation.
// For example: Body = "Message: {Contact.Name} says \"Hello World!\"";
foreach (var Contact in Contacts)
{
    MailMessage Msg = new MailMessage();
    
    MailMessage.Body = ${Body}
}
问题 这将使正文显示为:

信息:约翰向世界问好

相反,呈现的是:

信息:{Contact.FirstName}向世界问好

如果我没有在代码中硬编码字符串,如何将变量插入字符串?

${Body}不编译

您不能在运行时生成插值,它是一种语法糖,由编译器转换为String.Format

您可以使用“从StringBuilder替换”或“字符串”来解决问题:

${Body}未编译

您不能在运行时生成插值,它是一种语法糖,由编译器转换为String.Format

您可以使用“从StringBuilder替换”或“字符串”来解决问题:


字符串插值是编译时特性。这就是为什么你可以:

实际上,您正在将C代码放入字符串中


但是,如果它被实现为一个动态特性,您可以加载字符串并在运行时对其进行评估,那么您将面临与JavaScript中使用eval非常相似的安全风险。因此,不可能做您想做的事情是有道理的。

字符串插值是编译时特性。这就是为什么你可以:

实际上,您正在将C代码放入字符串中


但是,如果它被实现为一个动态特性,您可以加载字符串并在运行时对其进行评估,那么您将面临与JavaScript中使用eval非常相似的安全风险。因此,不可能做您想做的事情是有道理的。

字符串插值是编译时特性。它不能用于在运行时替换令牌。您的代码甚至不应该编译。应该是MailMessage.Body=${Body}…字符串插值是编译时功能。它不能用于在运行时替换令牌。您的代码甚至不应该编译。应该是MailMessage.Body=${Body}…String.Format很好,但它不会有相同的问题吗?无论如何,我不能让用户在写电子邮件时在邮件正文中键入{0}{1}etc标记。。。假设我可以始终将其保留为{Contact.FirstName},然后。完全替换…@Ortund是的,这是您需要做的,尽管我建议使用StringBuilder进行替换。@Ortund您可以通过多种方式解决问题,String.Replace是选项之一。替换{p.FirstName},p.FirstName;不过StringBuilder是一个更好的选择。我想无论我走哪条路,插值的问题现在都没有意义,所以接受答案变得很奇怪issue@Ortund事实上,这是一个有效的问题,我相信其他人也有同样的问题。String.Format可以,但不会有同样的问题吗?无论如何,我不能让用户在写电子邮件时在邮件正文中键入{0}{1}etc标记。。。假设我可以始终将其保留为{Contact.FirstName},然后。完全替换…@Ortund是的,这是您需要做的,尽管我建议使用StringBuilder进行替换。@Ortund您可以通过多种方式解决问题,String.Replace是选项之一。替换{p.FirstName},p.FirstName;不过StringBuilder是一个更好的选择。我想无论我走哪条路,插值的问题现在都没有意义,所以接受答案变得很奇怪issue@Ortund事实上,这是一个有效的问题,我相信其他人也有同样的问题。
private string _Body;
public string Body
{
    get { return _Body; }
    set
    {
        _Body = value;
        RaisePropertyChangedEvent("Body");
    }
}

var Contacts = Context.Contacts
  .Where(x => x.ContactGroupId == ContactGroupId && x.Deleted == false);

// By this point, Body will already have a value containing the interpolation.
// For example: Body = "Message: {Contact.Name} says \"Hello World!\"";
foreach (var Contact in Contacts)
{
    MailMessage Msg = new MailMessage();
    
    MailMessage.Body = ${Body}
}
sb.Replace("{p.FirstName}", p.FirstName);
Console.WriteLine($"When {condition} is true, {(condition ? "it's true!" : "It's False")}");