13

有没有直接的转换方法:

string str = "a=1,b=2,c=3";

进入:

dynamic d = new { a = 1, b = 2, c = 3 };

我想我可能会编写一个函数来拆分字符串并循环结果以创建动态对象。我只是想知道是否有更优雅的方式来做到这一点。

4

4 回答 4

13

我认为如果您将“=”转换为“:”并用大括号将所有内容包裹起来,您将获得一个有效的 JSON 字符串。

然后,您可以使用 JSON.NET 将其反序列化为动态对象:

dynamic d = JsonConvert.DeserializeObject<dynamic>(jsonString);

你会得到你想要的。

于 2013-07-17T13:04:08.757 回答
6

您可以使用Microsoft Roslyn这里是一体式 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() ";
于 2013-07-17T13:05:46.217 回答
1

您描述的问题类似于反序列化,即从数据形式(如字符串、字节数组、流等)构造对象。希望这个链接有帮助:http: //msdn.microsoft.com/en-us/library/vstudio/ms233843.aspx

于 2013-07-17T13:03:03.793 回答
1

这是一个ExpandoObject在自己解析后用于存储它的解决方案。现在它将所有值添加为strings,但您可以添加一些解析以尝试将其转换为 double、int 或 long(您可能希望按该顺序尝试)。

static dynamic Parse(string str)
{
    IDictionary<String, Object> obj = new ExpandoObject();
    foreach (var assignment in str.Split(','))
    {
        var sections = assignment.Split('=');
        obj.Add(sections[0], sections[1]);
    }
    return obj;
}

像这样使用它:

dynamic d = Parse("a=1,b=2,c=3");
// d.a is "1"
于 2013-07-17T13:09:07.010 回答