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

标签 c# dynamic ienumerable icollection expandoobject

我有一个 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/

相关文章:

c# - InvalidArgument=“3' is not valid for ' 索引”的值。参数名称 : index

c# - 在不使用逗号字符的情况下在 CSV 中显示逗号

android - 无法让 Listview 从数据库刷新

python:在动态字典中添加/append 动态键:值对

c# - yield return 语句中静态成员的初始化顺序

c# - LINQ,创建集合的唯一集合

c# - 如何对 IEnumerable 列表进行排序?

c# - 编译到不同的目标时,如何临时用另一种原始类型替换一种原始类型?

json - Go中根据字符串动态创建某种类型的变量

c# - 精确测量线程中代码的执行时间(C#)