我有一个ASP.NET MVC应用程序。我在我的应用中使用ExpandoObject
。目前,我的.cshtml文件中有以下块:
foreach (System.Dynamic.ExpandoObject expo in ViewBag.ExpandoObjects)
{
<div>@filter.GetType().FullName</div>
}
此代码工作正常。实际上,它会像我期望的那样在屏幕上打印System.Dynamic.ExpandoObject
。但是,当我将代码更新为以下内容时,出现错误。
foreach (System.Dynamic.ExpandoObject expo in ViewBag.ExpandoObjects)
{
foreach (var key in expo.Keys)
{
<div>@key</div>
}
}
错误说:
CS1061: 'System.Dynamic.ExpandoObject' does not contain a definition for 'Keys' and no extension method 'Keys' accepting a first argument of type 'System.Dynamic.ExpandoObject' could be found (are you missing a using directive or an assembly reference?)
我不明白为什么我收到这个错误。根据文档,有一个Keys property。我错过了什么?
答案 0 :(得分:3)
为Keys
接口显式实现了IDictionary
属性。例如,这不会编译:
Console.WriteLine(new ExpandoObject().Keys);
如果您想使用Keys
,则必须将其转换为IDictionary
。
foreach (System.Dynamic.ExpandoObject expo in ViewBag.ExpandoObjects)
{
foreach (var key in ((IDictionary<string, object>)expo).Keys)
{
<div>@key</div>
}
}
如果要按编译时知道的名称访问密钥,可以使用字典索引器或将对象强制转换为dynamic
。
foreach (IDictionary<string, object> expo in ViewBag.ExpandoObjects)
{
<div>@expo["name"]</div>
或
foreach (dynamic expo in ViewBag.ExpandoObjects)
{
<div>@expo.name</div>
这里有一个简短的代码段,可以让您了解如何使用ExpandoObject强制转换为ExpandoObject
,dynamic
或IDictionary<string, object>
:
var obj = new ExpandoObject();
var dict = ((IDictionary<string, object>)obj);
var dyn = (dynamic) obj;
dyn.name = "Fred";
Console.WriteLine(dyn.name); // "Fred"
var key = dict.Keys.Single();
Console.WriteLine(key); // "name"
Console.WriteLine(dict[key]); // "Fred"
请注意,我强烈建议您尽可能使用强类型视图模型。 dynamic
打字对于它的制作有利,但如果过度使用会破坏可维护性。