2008-10-02 49 views
21

我想在運行時生成一些代碼,我把一些鍋爐板的東西,並允許用戶輸入實際的工作代碼。我鍋爐板代碼看起來是這樣的:你怎麼把{和}格式字符串

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窗體應用程序,用於在沒有連接到網絡的系統上內部使用,因此在這種情況下風險是可以接受的。

+0

這是一個安全問題,因爲用戶可能執行的代碼可能是字面上的任何內容,而不是因爲它連接到「網絡」。 – MusiGenesis 2008-10-02 03:27:44

+0

其實不是,只是因爲代碼可能是任何東西都不會讓用戶有能力去做任何他以前無法做到的事情。該應用與用戶在相同的上下文中運行,只有有權訪問正在運行的計算機的人才可以引入代碼。 – 2008-10-09 19:42:23

回答

5

「{{」 和 「}}」

1

雙括號:string.Format("{{ {0} }}", "Hello, World");會產生{ Hello, World }

5

什麼我想你想要的是...

string formatString = @" 
using System; 

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

string entireClass = string.Format(formatString, userInput); 
0

對於誰有權訪問應用程序,要格外小心。更好的解決方案可能是創建一個簡單的解析器,只需要一些有限的命令。