22

我试图在运行时生成一些代码,在其中放入一些样板文件,并允许用户输入实际的工作代码。我的样板代码如下所示:

using System;

public class ClassName
{
    public double TheFunction(double input)
    {
        // user entered code here
    }
}

理想情况下,我想我想使用 string.Format 来插入用户代码并创建一个唯一的类名,但是除非它看起来像这样,否则格式字符串会出现异常:

string formatString = @"
using System;

public class ClassName
{0}
    public double TheFunction(double input)
    {0}
        {2}
    {1}
{1}";

然后我这样调用 string.Format :

string entireClass = string.Format(formatString, "{", "}", userInput);

这很好,我可以处理在格式字符串中使用 {0} 和 {1} 代替大括号的丑陋之处,只是现在我的用户输入也不能使用大括号。有没有办法在我的格式字符串中转义大括号,或者将用户代码中的大括号转换为 {0} 和 {1} 的好方法?

顺便说一句,我知道这种事情是一个等待发生的安全问题,但这是一个 Windows 窗体应用程序,供未连接到网络的系统内部使用,因此在这种情况下风险是可以接受的。

4

5 回答 5

39

通过将它们加倍来逃避它们:

string s = String.Format("{{ hello to all }}");
Console.WriteLine(s); //prints '{ hello to all }'

来自http://msdn.microsoft.com/en-us/netframework/aa569608.aspx#Question1

于 2008-10-02T03:14:14.237 回答
5

“{{“ 和 ”}}”

于 2008-10-02T03:14:02.677 回答
5

我想你想要的是这个...

string formatString = @"
using System;

public class ClassName
{{
    public double TheFunction(double input)
    {{
        {0}
    }}
}}";

string entireClass = string.Format(formatString, userInput);
于 2008-10-02T03:16:12.250 回答
1

双括号:string.Format("{{ {0} }}", "Hello, World");会产生{ Hello, World }

于 2008-10-02T03:14:43.910 回答
0

在谁有权访问该应用程序时要格外小心。更好的解决方案可能是创建一个只需要几个有限命令的简单解析器。

于 2008-10-02T08:24:27.627 回答