2008年3月12日水曜日

Normalization

ASP.NET MVC p2をいじってみてるんだけど、クラスのリファレンスが見当たらないのは気のせいなのかな。RouteValueDictionaryって?IDictionary<string,object>のコンストラクタの使い方が分からなくて足止め。 ASP.NET MVC Normalization - ASP.NET Forums

new Dictionary<string,object> { {"class", "user-login" } } 
↓instead of  
new { @class = "user-login" }  

@classってなんだ!?Verbatim?ダブルクォーテーションなくてもいいのか。結局はリテラルと同じ動きになるね(匿名クラスでclassって名前のメンバを使うからあえて@つけてるのかな~)。 匿名クラスはそのままConsole.WriteLineで書きだすと、inspect的な出力になるのに、class定義して同じようにしてもクラス名しか出力しない。c#でinspectってないのかな。

class cdct { public string key1 { get; set; } public string key2 { get; set; } public string key3 { get; set; } } var dct1 = new { key1 = "value1", key2 = "value2", key3 = "value3" }; var dct2 = new cdct { key1 = "value1", key2 = "value2", key3 = "value3" }; Console.WriteLine(dct1); // => { key1 = value1, key2 = value2, key3 = value3 } Console.WriteLine(dct2); // => ConsoleApplication.cdct

簡単な拡張メソッドでそれっぽくしてみた。

static class ObjectExt { public static string Inspect(this object obj) { return Inspect(obj, false); } public static string Inspect(this object obj, bool withType) { bool first = true; string inspect = ""; Type t = obj.GetType(); foreach (MemberInfo mi in t.GetMembers()) { if (mi.MemberType == MemberTypes.Property) { inspect += (first ? "" : ",") + mi.Name + "=" + t.GetProperty(mi.Name).GetValue(obj, null); first = false; } } return (withType ? t.ToString() : "") + "{" + inspect + "}"; } }

へぼいから取扱注意。

Console.WriteLine(dct1.Inspect()); // => {key1=value1,key2=value2,key3=value3} Console.WriteLine(dct2.Inspect()); // => {key1=value1,key2=value2,key3=value3}