是否有转换的一个简单的方法:我想我大概可以写一个分割字符串和循环的结果,建立一个功能字符串转换为动态对象
dynamic d = new { a = 1, b = 2, c = 3 };
:
string str = "a=1,b=2,c=3";
成动态的对象。我只是想知道是否有一个更优雅的方式来做到这一点。
是否有转换的一个简单的方法:我想我大概可以写一个分割字符串和循环的结果,建立一个功能字符串转换为动态对象
dynamic d = new { a = 1, b = 2, c = 3 };
:
string str = "a=1,b=2,c=3";
成动态的对象。我只是想知道是否有一个更优雅的方式来做到这一点。
您可以使用Microsoft Roslyn(here的所有功能于一身的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() ";
这很有趣。我不知道它是否会打开代码注入漏洞?就像转义字符串并执行类似于sql注入的随机代码一样? – Coltech
你所描述的问题与反序列化一样,也就是从数据表单(如字符串,字节数组,流等)构造对象。希望这个链接帮助:http://msdn.microsoft.com/en-us/library/vstudio/ms233843.aspx
我想如果你将“=”转换成“:”并用大括号包住所有东西,你将得到一个有效的JSON字符串。
然后可以使用JSON.NET将其反序列化到一个动态对象:
dynamic d = JsonConvert.DeserializeObject<dynamic>(jsonString);
你会得到你想要的。
如果一个字符串包含'=' –
我想问题只是关于数字,反正它只是一个建议。 –
我早些时候要求澄清。看到原始问题的评论:它可以是任何简单的类型(包括字符串)。 –
这里是自己进行解析后使用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"
同样,问题源于字符串可能包含','的事实。在这种情况下,盲目分裂并不是一个好主意。如果输入是:'a = 1,b = 2,c ='这个,我的朋友,是一个字符串'' –
恩,好点;但就此而言,这种格式到底是什么?是否是有效的字符串分隔符? '''''怎么样?如果你想要一个字符串,你如何逃避这些分隔符?简而言之,我不知道格式是非常明确的。 –
同意,我们不太了解输入以及如何它已被消毒(如果他有控制权的话) –
你期望的值是什么?总是'int'? –
@SimonL不,值可以是任何数据类型。 – Coltech
当你说_any_时,这也可以是类吗?或只是简单的类型('字符串,数字类型) –