変換する簡単な方法はありますか:
string str = "a=1,b=2,c=3";
の中へ:
dynamic d = new { a = 1, b = 2, c = 3 };
文字列を分割し、結果をループして動的オブジェクトを作成する関数をおそらく作成できると思います。これを行うよりエレガントな方法があるかどうか疑問に思っていました。
「=」を「:」に変換し、すべてを中かっこで囲むと、有効な JSON 文字列が得られると思います。
その後、JSON.NET を使用して動的オブジェクトに逆シリアル化できます。
dynamic d = JsonConvert.DeserializeObject<dynamic>(jsonString);
あなたが望むものを手に入れるでしょう。
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() ";
あなたが説明した質問は、デシリアライゼーションのようなものです。つまり、データ形式 (文字列、バイト配列、ストリームなど) からオブジェクトを構築します。このリンクが役立つことを願っています: http://msdn.microsoft.com/en-us/library/vstudio/ms233843.aspx
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"