2008-10-02 17 views
21

Estoy tratando de generar algo de código en tiempo de ejecución donde pongo un poco de materia en la caldera de la placa y se permite que el usuario introduzca el código de trabajo real. Mi código de la caldera de la placa es como la siguiente:¿cómo poner {y} en una cadena de formato

using System; 

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

Idealmente, yo creo que quiera utilizar string.Format para insertar el código de usuario y crear un nombre de clase única, pero me da una excepción en la cadena de formato, a menos se parece a esto:

string formatString = @" 
using System; 

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

Entonces me llaman string.Format así:

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

esto está bien y puedo hacer frente a la fealdad de utilizar {0} y {1} en el formato cadena en lugar de mi llaves, excepto que ahora mi entrada de usuario tampoco puede usar llaves. ¿Hay alguna manera de escapar de las llaves en mi cadena de formato, o una buena manera de convertir las llaves en el código de usuario en {0} 's y {1}' s?

Por cierto, sé que este tipo de cosas es un problema de seguridad, pero esta es una aplicación de Windows Forms para uso interno en sistemas que no están conectados a la red por lo que el riesgo es aceptable en esta situación.

+0

Es un problema de seguridad porque el código que podría ejecutar un usuario podría ser literalmente cualquier cosa, no porque esté conectado a la red. – MusiGenesis

+0

En realidad no, solo porque el código podría ser cualquier cosa no le da al usuario la capacidad de hacer algo que antes no podía hacer. La aplicación se ejecuta en el mismo contexto que el usuario y solo alguien con acceso a la máquina en la que se ejecuta puede introducir código. –

Respuesta

5

"{{" y "}}"

1

doble de las llaves: string.Format("{{ {0} }}", "Hello, World"); produciría { Hello, World }

5

Lo Creo que quieres es esto ...

string formatString = @" 
using System; 

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

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

Sea extremadamente prudente en cuanto a quién tiene acceso a la aplicación. Una mejor solución podría ser crear un analizador simple que solo espera unos pocos comandos limitados.

+0

Sí, solo habrá 5 o 6 personas que alguna vez tengan motivos para usar esta aplicación, así que como dije, el riesgo es muy aceptable. –

Cuestiones relacionadas