【发布时间】:2013-06-05 01:30:16
【问题描述】:
给定一个System.Object,我如何获得一个动态对象来访问它可能拥有的任何成员。
具体来说,我想对返回 JsonResult 的 ASP.NET MVC 3 控制器操作进行单元测试。 JsonResult 具有 Data 类型的 object 属性。我用匿名类型填充这个对象:
return Json(new { Success = "Success" });
在我的测试中,我想做类似的事情
var result = controller.Foo();
Assert.That(((SomeDynamicType)result.Data).Success, Is.EqualTo("Success"));
这是怎么做到的?
更新
虽然result.Data 的类型是object,但在Watch 窗口中检查它会发现它具有以下类型:
{
Name = "<>f__AnonymousType6`1"
FullName = "<>f__AnonymousType6`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"
}
System.Type {System.RuntimeType}
【问题讨论】:
-
result.Data的类型是什么?是new {...}或Json对象还是string或...? 假设 result.Data 符合预期,它应该可以工作,这是一个可以工作的 LINQPad 示例:var x = new { X = 1 }; var y = (dynamic)x; ((object)y.X).Dump();。 -
@pst,
result.Data被键入为object,但它由传递给return Json(...)调用的new {Success = "Success"}填充。 -
可以看到
JsonResult是如何创建的吗?我看到一个Json包装了new {}...(使用的完整Json类型是什么?)尝试打破异常并在 Data 中查看对象的数据/类型信息。比较new {...}对象(也可以通过引用)和 Data 中的对象。
标签: c# unit-testing asp.net-mvc-3 dynamic expandoobject