Вы можете использовать Microsoft Roslyn (here «s все-в-одном 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);
}
}
И если вы хотите добавить еще более сложные типы:
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);
Основываясь на вопрос в вашем комментарии, есть уязвимости при инъекции кода. Добавьте System
ссылку и пространство имен, как показано на рисунке справа выше, а затем заменить str
с:
string str =
@" a=1, oops = (new Func<int>(() => {
Console.WriteLine(
""Security incident!!! User {0}\\{1} exposed "",
Environment.UserDomainName,
Environment.UserName);
return 1;
})).Invoke() ";
Что вы ожидаете значения быть? Всегда 'int'? –
@SimonL Нет, значения могут быть любыми типами данных. – Coltech
Когда вы говорите _any_, это может быть класс? Или просто простые типы ('string', числовые типы) –