Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字符串转换为动态对象_C#_Dynamic - Fatal编程技术网

C# 将字符串转换为动态对象

C# 将字符串转换为动态对象,c#,dynamic,C#,Dynamic,是否有一种简单的转换方法: string str = "a=1,b=2,c=3"; 进入: 我想我可能可以编写一个函数来拆分字符串并循环结果以创建动态对象。我只是想知道是否有更优雅的方法来实现这一点。您描述的问题类似于反序列化,即从数据形式(如字符串、字节数组、流等)构造对象。希望此链接有帮助:我认为如果您将“=”转换为“:”,并将所有内容用花括号括起来,您将得到一个有效的JSON字符串 然后,您可以使用JSON.NET将其反序列化为动态对象: dynamic d = JsonConvert.

是否有一种简单的转换方法:

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


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

您描述的问题类似于反序列化,即从数据形式(如字符串、字节数组、流等)构造对象。希望此链接有帮助:

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

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

dynamic d = JsonConvert.DeserializeObject<dynamic>(jsonString);
dynamic d=JsonConvert.DeserializeObject(jsonString);
你会得到你想要的。

你可以使用('s all-in-one NuGet package):

如果要添加更复杂的类型:

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);
根据您评论中的问题,存在代码注入漏洞。添加如上所示的
系统
引用和命名空间,然后将
str
替换为:

string str =
    @" a=1, oops = (new Func<int>(() => { 
                Console.WriteLine(
                    ""Security incident!!! User {0}\\{1} exposed "",
                    Environment.UserDomainName,
                    Environment.UserName); 
                return 1; 
            })).Invoke() ";
string str=
@“a=1,oops=(新函数(()=>{
控制台写入线(
“”安全事件!!!用户{0}\\{1}暴露了“”,
Environment.UserDomainName,
环境(用户名);
返回1;
})).Invoke()”;
这里有一个解决方案,用于在自己解析后存储它。现在,它将所有值添加为
string
s,但您可以添加一些解析来尝试将其转换为double、int或long(您可能希望按该顺序进行尝试)


你期望这些值是什么?始终
int
?@SimonL否,值可以是任何数据类型。当您说any时,这也可以是类吗?或者只是简单的类型(
string
s,数字类型)@Simon:只是简单的类型,比如string和数字类型如果一个字符串包含
=
,我想问题只是关于数字,无论如何,这只是一个建议。我之前要求澄清。查看原始问题的注释:它可以是任何简单类型(包括字符串)。好吧,主要思想可以工作,他如何将原始值转换为json可以通过多种方式完成。不管怎样,我认为亚历克斯的回答是最好的。我认为使用
JsonConvert
是最好的选择,如果您能够克服转换为正确的Json字符串的困难。同样,问题源于字符串可能包含
。在这种情况下,盲目拆分不是一个好主意。如果输入是:
a=1,b=2,c='这是一个字符串'
Hm,很好;但就这一点而言,这种格式到底是什么?
是有效的字符串分隔符吗?那
”呢?如果你想在字符串中加一个分隔符,你如何转义这些分隔符呢?简言之,我不知道格式是否定义得很好。同意,我们不太了解输入以及它是如何被净化的(如果他完全控制了它)。在任何情况下,对于简单的数字类型和简单的字符串(那些不会有任何这些复杂因素的人),我的解决方案会起作用。我不知道这是否足够,但总比没有好。:)这很有趣。我想知道它是否会打开代码注入漏洞?比如转义字符串和执行类似sql注入的随机代码?
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);
string str =
    @" a=1, oops = (new Func<int>(() => { 
                Console.WriteLine(
                    ""Security incident!!! User {0}\\{1} exposed "",
                    Environment.UserDomainName,
                    Environment.UserName); 
                return 1; 
            })).Invoke() ";
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"