2013-07-17 172 views
10

是否有转换的一个简单的方法:我想我大概可以写一个分割字符串和循环的结果,建立一个功能字符串转换为动态对象

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

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

成动态的对象。我只是想知道是否有一个更优雅的方式来做到这一点。

+0

你期望的值是什么?总是'int'? –

+0

@SimonL不,值可以是任何数据类型。 – Coltech

+0

当你说_any_时,这也可以是类吗?或只是简单的类型('字符串,数字类型) –

回答

6

您可以使用Microsoft Roslynhere的所有功能于一身的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() "; 
+2

这很有趣。我不知道它是否会打开代码注入漏洞?就像转义字符串并执行类似于sql注入的随机代码一样? – Coltech

7

我想如果你将“=”转换成“:”并用大括号包住所有东西,你将得到一个有效的JSON字符串。

然后可以使用JSON.NET将其反序列化到一个动态对象:

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

你会得到你想要的。

+1

如果一个字符串包含'=' –

+0

我想问题只是关于数字,反正它只是一个建议。 –

+0

我早些时候要求澄清。看到原始问题的评论:它可以是任何简单的类型(包括字符串)。 –

1

这里是自己进行解析后使用ExpandoObject存储它的解决方案。现在它将所有值都添加为string s,但您可以添加一些解析来尝试将其转换为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" 
+2

同样,问题源于字符串可能包含','的事实。在这种情况下,盲目分裂并不是一个好主意。如果输入是:'a = 1,b = 2,c ='这个,我的朋友,是一个字符串'' –

+0

恩,好点;但就此而言,这种格式到底是什么?是否是有效的字符串分隔符? '''''怎么样?如果你想要一个字符串,你如何逃避这些分隔符?简而言之,我不知道格式是非常明确的。 –

+0

同意,我们不太了解输入以及如何它已被消毒(如果他有控制权的话) –