Można użyć Microsoft Roslyn (here „s all-in-one pakiet 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);
}
}
A jeśli chcesz dodać jeszcze bardziej złożone typy:
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);
opiera się na pytanie w komentarzu, są luki w zabezpieczeniach kodu. Dodaj odwołanie System
i nazw, jak pokazano tuż powyżej, następnie wymień str
z:
string str =
@" a=1, oops = (new Func<int>(() => {
Console.WriteLine(
""Security incident!!! User {0}\\{1} exposed "",
Environment.UserDomainName,
Environment.UserName);
return 1;
})).Invoke() ";
Czego oczekujesz wartości być? Zawsze 'int'? –
@SimonL Nie, wartości mogą być dowolnym typem danych. – Coltech
Kiedy mówisz: _any_, czy to też może być klasa? Lub po prostu typy proste ('string's, typy liczbowe) –