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

それらを2倍にしてエスケープします。

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

中括弧を 2 倍にするstring.Format("{{ {0} }}", "Hello, World");:{ Hello, World }

于 2008-10-02T03:14:43.910 に答える
0

誰がアプリケーションにアクセスできるかについては、特に注意してください。より良い解決策は、いくつかの限定されたコマンドのみを想定する単純なパーサーを作成することです。

于 2008-10-02T08:24:27.627 に答える