c# - Foreach 语句无法对 'object' 类型的变量进行操作,因为 'object' 不包含 'GetEnumerator' 的公共(public)定义

标签 c# enumerate

我试图弄清楚如何通过 API 访问对象中的值,但运气不佳。有一些文档,但不多。我可以访问一些信息,但我要查找的信息存在于该软件正在使用的数据库的关键字字段中。我可以打印出对象类型,但不能打印出实际对象中的值。

这是我的代码:

 public class Test
    {
        public static ServiceConnection ConnectToDocuWare(Uri uri, string userName, string passWord)
        {
            return ServiceConnection.Create(uri, userName, passWord);
        }

        static void Main()
        {

            var userName;
            var passWord;
            var uri;
            var conn = ConnectToDocuWare(uri, userName, passWord);
            var org = conn.Organizations[0];
            var fileCabinets = org.GetFileCabinetsFromFilecabinetsRelation().FileCabinet;
            var fileCabinet = fileCabinets.SingleOrDefault(x => x.Name == "someValue");
            string documentID = "1";
            int DWID = int.Parse(documentID);
            string FCID = fileCabinet.Id;


            var dialogInfoItems = fileCabinet.GetDialogInfosFromDialogsRelation();
            var dialog = dialogInfoItems.Dialog.SingleOrDefault(x => x.DisplayName == "Some Value").GetDialogFromSelfRelation();
            var DocResults = RunQuery(dialog, documentID);


            foreach (Document doc in DocResults.Items)
            {
                var item = doc.GetDocumentFromSelfRelation();


                foreach (var itemInfo in item.Fields)
                {
                    if (itemInfo.ItemElementName.ToString() == "Keywords")
                    {
                        Console.WriteLine(itemInfo.Item);

                    }
                }
            }
        Console.ReadLine();
        }

        public static DocumentsQueryResult RunQuery(Dialog dialog, string DWDocID)
        {
            var q = new DialogExpression()
            {
                Operation = DialogExpressionOperation.And,
                Condition = new List<DialogExpressionCondition>()
                {
                    DialogExpressionCondition.Create("DWDOCID", DWDocID),
                },
                Count = 100,
                SortOrder = new List<SortedField>
                {
                    SortedField.Create("DWSTOREDATETIME", SortDirection.Desc)
                }
            };
            var queryResult = dialog.GetDocumentsResult(q);
            return queryResult;
        }
    }

这仅输出对象类型。我尝试使用 foreach 循环输出 ItemInfo.Item 对象中的所有内容,但收到此错误: Foreach 语句无法对“object”类型的变量进行操作,因为“object”不包含“GetEnumerator”的公共(public)定义

本质上,我正在尝试访问关键字字段中的值以供稍后使用。

最佳答案

错误信息非常明确——你只能使用foreach在具有 GetEnumerator 公共(public)定义的对象上循环方法。

来自foreach, in (C# Reference) Microsoft 文档中的页面:

The foreach statement repeats a group of embedded statements for each element in an array or an object collection that implements the System.Collections.IEnumerable or System.Collections.Generic.IEnumerable<T> interface.

这意味着您不能使用 foreach在您想要的任何类(或结构)的任何实例上循环,因为无论 in 使用什么, foreach的一部分循环必须提供一个枚举器。

有趣的事实:如 Enigmativity this answer中指出, foreach 循环工作真正需要的只是有一个名为 GetEnumerator() 的公共(public)方法。 ,并让该公共(public)方法返回一个具有几个方法和一个属性的实例,即 void Reset() , bool MoveNext() ,和T Current { get; private set; } ,哪里T是某种类型。

这意味着您不需要将您的类声明为实现 IEnumerableIEnumerable<T>接口(interface),并且您的枚举器不需要声明为实现 IEnumeratorIEnumerator<T>接口(interface) - 您提供定义相关接口(interface)的方法和属性就足够了 - 这就是 c# 编译器使用 foreach 的所有要求。循环。

关于c# - Foreach 语句无法对 'object' 类型的变量进行操作,因为 'object' 不包含 'GetEnumerator' 的公共(public)定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48071088/

相关文章:

mysql - 在 MySQL 中按顺序、分组和按日期枚举记录

python - 只需要索引 : enumerate or (x)range?

c# - mscorlib 代表什么?

python - 类型错误 : argument to reversed() must be a sequence

Python:如何将数字映射到列中的唯一项目(枚举唯一对象)?

c# - Javascript/.NET 正则表达式

c# - 如何在 SQL Server 中列出数据库,而不是通过查询,而是通过 c# 调用?

c# - ERR_CONNECTION_REFUSED - .Net Core 1.0.1

c# - 如何使用 C# 将所有特殊字符替换为字符串

c# - Lucene.Net (4.8) 自动完成/自动建议