字符串插入变量

时间:2017-07-21 11:05:50

标签: c#

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

概念证明

public class Program
{
    public static void Main()
    {
        var p = new Person { FirstName = "John", LastName = "Smith" };
        var msg = $"{p.FirstName} says 'Hello World!'";

        Console.WriteLine($"Message: {msg}");
    }
}
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

这个概念证明输出字符串:

  

消息:John说'Hello World!'

实施

所以现在当我尝试使用这个概念来构建我的MailMessage时,我的电子邮件中输出{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}
}

问题

这应该使主体读为:

  

消息:John说“Hello World!”

相反,呈现的是:

  

消息:{Contact.FirstName}说“Hello World!”

如果我在代码中实际上没有对字符串进行硬编码,如何将变量插入到字符串中?

2 个答案:

答案 0 :(得分:4)

public class Main { public static void main(String args[]) { Library library = new Library(); SerializationSjow seri = new SerializationSjow(); seri.deserialization(library); library.loginMenu(); seri.serialization(library); } } 无法编译。

你不能在运行时生成插值,它是一个语法糖,由编译器转换为${Body}

您可以使用String.FormatReplace中的StringBuilder来解决您的问题:

String

答案 1 :(得分:0)

字符串插值是一种编译时功能。这就是为什么你可以do some neat things like

Console.WriteLine($"When {condition} is true, {(condition ? "it's true!" : "It's False")}");

你基本上将C#代码放在字符串

但是,如果它是作为动态功能实现的,您可以在其中加载字符串并在运行时对其进行评估,那么您将面临安全风险,就像在JavaScript中使用eval一样。那么,有意义的是,你不可能做你想做的事。