我试图使用一个应用程序来调用一个api,并返回一个用户特有的数据。我已经为导入的项目做了一个单独的类。
public class ItemList
{
public class Task : IEnumerable<Task>
{
public string variable1 { get; set; }
....
}
public IEnumerator<Task> GetEnumerator()
{
return taskList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return taskList.GetEnumerator();
}
}
在一个单独的类中,我做了一个http调用,返回json,并将其分类为任务。
WebRequest requestObjGet = WebRequest.Create(url);
//headers, etc
responseObjGet = (HttpWebResponse)requestObjGet.GetResponse();
using (Stream stream = responseObjGet.GetResponseStream())
{
StreamReader sr = new StreamReader(stream);
strResultTest=sr.ReadToEnd();
ItemList userActiveItemData = JsonConvert.DeserializeObject<ItemList>(strResultTest);
foreach(Task item in userActiveITemData)
{
// DO A THING
}
}
这里我得到一个错误,foreach不能对类型为 ItemList
因为 ItemList
的公共实例,不包含 GetEnumerator
.
谁能帮我运行这个循环?
如果您想使用 ItemList
作为 IEnumerable<Task>
那么我想我们需要把你的 Task
类的范围,与 ItemList
,并使 ItemList
实施 IEnumerable<Task>
.
在下面的代码中,我已经重新命名为 Task
到 MyTask
为了避免与众所周知的 "大国重器 "相混淆。System.Threading.Tasks.Task
类。
public class MyTask
{
public string variable1 { get; set; }
}
public class ItemList : IEnumerable<MyTask>
{
public IEnumerable<MyTask> taskList = new List<MyTask>();
public IEnumerator<MyTask> GetEnumerator()
{
return taskList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return taskList.GetEnumerator();
}
}
该类 ItemList
是不需要的。您正试图实现 IEnumerable
接口,它可以被一个简单的 List<Task>
或 Task[]
其中已经实现了 IEnumerable
.
你可以将JSON反序列化为一个与JSON结构相对应的模型。
var model = JsonConvert.DeserializeObject<TasksModel>(strResultTest);
foreach(Task item in model.Tasks)
{
// DO A THING
}
模型。
public class TasksModel
{
[JsonProperty("tasks")]
public List<Task> Tasks { get; set; }
}
public class Task
{
[JsonProperty("variable1")]
public string Variable1 { get; set; }
[JsonProperty("variable2")]
public string Variable2 { get; set; }
}
有许多在线工具可以将你的JSON响应转换为合适的C#模型,所以你需要做的就是调用 JsonConvert.DeserializeObject<T>
来获取对IEnumerable的访问。
假设来自webserver的响应是这样的格式。{"tasks": [{"variable1":"value1", "variable2":"value2"}, {"variable1":"value1.2", "variable2":"value2.2"}]}
我们得到以下C#模型(https:/app.quicktype.io?l=csharp。):
public partial class TaskModel
{
public Task[] Tasks { get; set; }
}
public partial class Task
{
public string Variable1 { get; set; }
public string Variable2 { get; set; }
}
请注意,由于 TaskModel
是根,你可以随意称呼它。
然后,我们可以像这样在foreach循环中获得对任务的访问权。
WebRequest requestObjGet = WebRequest.Create("http://someurl.com");
var response = (HttpWebResponse)requestObjGet.GetResponse();
using (Stream stream = response.GetResponseStream())
{
StreamReader sr = new StreamReader(stream);
var strResultTest = sr.ReadToEnd();
TaskModel taskModel = JsonConvert.DeserializeObject<TaskModel>(strResultTest);
foreach (var task in taskModel.Tasks)
{
// DO A THING
}
}