È possibile utilizzare Microsoft Roslyn (here s' all-in-one package NuGet):
class Program
{
static void Main(string[] args)
{
string str = "a=1,b=2,c=3,d=\"4=four\"";
string script = String.Format("new {{ {0} }}",str);
var engine = new ScriptEngine();
dynamic d = engine.CreateSession().Execute(script);
}
}
E se si desidera aggiungere tipi ancora più complesse:
string str = "a=1,b=2,c=3,d=\"4=four\",e=Guid.NewGuid()";
...
engine.AddReference(typeof(System.Guid).Assembly);
engine.ImportNamespace("System");
...
dynamic d = engine.CreateSession().Execute(script);
Sulla base della domanda nel tuo commento, ci sono vulnerabilità di iniezione di codice. Aggiungere il riferimento System
e spazio dei nomi come mostrato proprio sopra, quindi sostituire il str
con:
string str =
@" a=1, oops = (new Func<int>(() => {
Console.WriteLine(
""Security incident!!! User {0}\\{1} exposed "",
Environment.UserDomainName,
Environment.UserName);
return 1;
})).Invoke() ";
fonte
2013-07-17 13:05:46
Che cosa si aspetta il valore di essere? Sempre 'int'? –
@SimonL No, i valori potrebbero essere qualsiasi tipo di dati. – Coltech
Quando dici _any_, potrebbero essere anche le classi? O solo tipi semplici ('string's, tipi di numeri) –