gpt4 book ai didi

c# - 无法将带 [] 的索引应用于类型为 'object' 的表达式(即使类型为 'dynamic' )

转载 作者:行者123 更新时间:2023-11-30 20:51:03 26 4
gpt4 key购买 nike

我有一个 ExpandoObject它是这样创建的:

public ExpandoObject Get()
{
var expando = new ExpandoObject();
var expandoDic = (IDictionary<string, dynamic>)expando;

// go through the items in the dictionary and copy over the key value pairs)
foreach (var f in GetFieldList())
{
if (f.MaxValues == 1)
{
var val = f.Values.Count > 0 ? f.Values[0] : null;
if (f.displayType == DisplayType.Entity && f.AttachedEntities != null && f.AttachedEntities.Any())
{
if (f.AttachedEntities.Count == 1)
{
expandoDic.Add(new KeyValuePair<string, dynamic>(f.Code, f.AttachedEntities[0].Get()));
}
else
{
expandoDic.Add(new KeyValuePair<string, dynamic>(f.Code, f.AttachedEntities.Select(e => e.Get())));
}
}
else
{
expandoDic.Add(new KeyValuePair<string, dynamic>(f.Code, GetTypedValue(f.GetValueType(), val)));
}

}
else
{
expandoDic.Add(new KeyValuePair<string, dynamic>(f.Code, (dynamic)f.Values.Select(v => GetTypedValue(f.GetValueType(), v))));
}
}
return expando;
}

GetTypedValue简单地将字符串值转换为适当的类型并返回 dynamic .

我遇到的问题是,如果我将一个集合添加到 expandoDic然后我无法访问成员而不将其转换为 ICollection类型。考虑以下代码,其中 myPage 是由上述方法创建的 ExpandoObject。

Response.Write(myPage.menu.items[0]);

菜单属性是一个动态对象,items 也是。 .后者是字符串的集合,尽管类型实际上是 IEnumerable<dynamic>'. If I inspect myPage.menu.items, it tells me the type is动态 {System.Linq.Enumerable.WhereSelectListIterator}`。上面的代码会产生以下错误:

Cannot apply indexing with [] to an expression of type 'object'

如果我使用 First()我得到的不是索引,而是这个错误:

'object' does not contain a definition for 'First'

我知道我可以投 itemsIEnumerable并立即解决问题,但我正在编写一个开发框架并希望消除开发人员使用它的任何障碍。

最佳答案

对于动态类型,您不能在没有转换的情况下使用扩展方法,但您可以使用该方法的静态调用,而不是:

var a = yourDynamic.First();

你应该写

var a = Enumerable.First(yourDynamic);

关于c# - 无法将带 [] 的索引应用于类型为 'object' 的表达式(即使类型为 'dynamic' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22091751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com