【问题标题】:Foreach statement cannot operate on variables of type 'object' because 'object' does not contain a public definition for 'GetEnumerator'Foreach 语句无法对“object”类型的变量进行操作,因为“object”不包含“GetEnumerator”的公共定义
【发布时间】:2018-01-03 04:17:06
【问题描述】:

我试图弄清楚如何通过 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”的公共定义

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

【问题讨论】:

  • 这里出现错误:Console.WriteLine(itemInfo.Item);
  • 这里是关于类对象的文档:help.docuware.com/sdk/platform/html/…
  • 你为什么要删除your question from earlier 并发布这个,这肯定看起来是完全相同的文字?我花时间查看了您的文档,以便您弄清楚哪些类型在起作用,并评论它们与您的错误的关系,而不是得到响应,它现在已经消失了。其他评论者也试图帮助您,但现在我们从头开始。尽管您的帖子确实收到了反对/关闭投票,但删除会阻止用户帮助您
  • 抱歉,我在尝试使用以下代码枚举对象时遇到错误:foreach (DocumentIndexFieldKeywords keywords in itemInfo.Item) { Console.WriteLine(keywords); }
  • 我很抱歉,因为删除,我认为人们已经放弃了帮助我,所以我重新发布。

标签: c# enumerate


【解决方案1】:

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

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

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

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

有趣的事实:正如Enigmativitythis answer 中指出的那样,要使foreach 循环正常工作,您真正需要的是拥有一个名为GetEnumerator() 的公共方法,并让该公共方法返回一个带有几个方法的实例和一个属性,即void Reset()bool MoveNext()T Current { get; private set; },其中T 是某种类型。

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

【讨论】:

  • 那么,我的回答出了什么问题,应该被否决?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 2017-03-08
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多