我试图弄清楚如何通过 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 theSystem.Collections.IEnumerable
orSystem.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
是某种类型。
这意味着您不需要将您的类声明为实现 IEnumerable
或IEnumerable<T>
接口(interface),并且您的枚举器不需要声明为实现 IEnumerator
或IEnumerator<T>
接口(interface) - 您提供定义相关接口(interface)的方法和属性就足够了 - 这就是 c# 编译器使用 foreach
的所有要求。循环。
关于c# - Foreach 语句无法对 'object' 类型的变量进行操作,因为 'object' 不包含 'GetEnumerator' 的公共(public)定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48071088/