Convert String Into Dynamic Object

c#, dynamic

Solution

You may use Microsoft Roslyn (here's the all-in-one NuGet package):

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);
    }
}

And if you want to add even more complex types:

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);

Based on the question in your comment, there are code injection vulnerabilities. Add the `System` reference and namespace as shown right above, then replace the `str` with:

string str =
    @" a=1, oops = (new Func<int>(() => { 
                Console.WriteLine(
                    ""Security incident!!! User {0}\\{1} exposed "",
                    Environment.UserDomainName,
                    Environment.UserName); 
                return 1; 
            })).Invoke() ";

Problem

Is there a straightforward way of converting: ``` string str = "a=1,b=2,c=3"; ``` into: ``` dynamic d = new { a = 1, b = 2, c = 3 }; ``` I think I could probably write a function that splits the string and loops the results to create the dynamic object. I was just wondering if there was a more elegant way of doing this.

Original source