Foreach 语句无法对“object”类型的变量进行操作,因为“object”不包含“GetEnumerator”的公共定义

Tom*_*m D 3 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

Zoh*_*led 6

错误消息非常清楚 - 您只能foreach在具有该GetEnumerator方法的公共定义的对象上使用循环。

foreach 中,在 Microsoft 文档的(C# 参考)页面中:

foreach语句为实现System.Collections.IEnumerableorSystem.Collections.Generic.IEnumerable<T>接口的数组或对象集合中的每个元素重复一组嵌入语句。

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

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

这意味着您不需要将您的类声明为实现IEnumerableorIEnumerable<T>接口,并且您的 Enumerator 不需要声明为实现IEnumeratororIEnumerator<T>接口 - 提供定义它的方法和属性就足够了相关接口 - 就是这样c# 编译器要求使用foreach循环。