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 に答える