@using System.Text @using System.Collections @using System.Reflection @functions { public static string Inspector(object model) { if (model == null) return ""; var type = model.GetType(); if (type == typeof(string)) return model.ToString(); var properties = type.GetProperties(); var inspect = new StringBuilder(); inspect.Append("{"); var vals = new List<string>(); foreach (PropertyInfo property in properties) { var val = property.GetValue(model, null); var name = property.Name; if (val != null) { if ((property.PropertyType.IsArray || val as IEnumerable != null) && property.PropertyType != typeof(string)) { // ちょっとズル。 val = "["+string.Join(",", (from object v in (IEnumerable)val where v != null select Inspector(v)).ToArray())+"]"; } else if (property.PropertyType.IsClass && property.PropertyType != typeof(string)) { var descendants = Inspector(val); if (descendants != null) val = descendants; } else { val = val.ToString(); } val = string.Format("{0}:{1}", name, val); } vals.Add(val.ToString()); } inspect.Append(string.Join(",", vals)); inspect.Append("}"); return inspect.ToString(); } } @{ var model = new { Name = "オレがルールだ!", FavoriteSong = "明日があるさ", List = new List<string> { "First", "Second", "Third" }, Sub = new { Name = "昔ね", Description = "そんなブログもあったよね" } }; } @Html.Raw(Inspector(model))
WebMatrixにはデバッガがないのでデバッグやテストの時に不便ですよね。なので、お手軽Inspector。
確か、NuGetにちゃんとしたのがあった気がするけど気にしない。最初はTypeDescriptorでPropertyDescriptorで取得しようとしたけど、Medium Trustでは駄目だったからReflectionで。
試してみたい場合はもちろんRazor Do It。
今日は違うことする予定だったんだけど、なんかどうしても試したくなったっす。やむなしっす。