【问题标题】:Iterating through DataContract class遍历 DataContract 类
【发布时间】:2015-10-28 20:37:46
【问题描述】:

我有一个返回 Response2 的类,其中只包含我关心的两个定义:

Response3.Id
Response3.Name

但是,此数据作为列表返回,b/c 我的类定义如下所示:

[DataContract]
public class Response2
{
    [DataMember(Name = "done")]
    public bool done;
    [DataMember(Name = "records")]
    public List<Response3> r3entry;
}

[DataContract]
public class Response3
{
    [DataMember(Name = "Id")]
    public string strId { get; set; }
    [DataMember(Name = "Name")]
    public string strName { get; set; }
}

现在我有一个要遍历的字符串列表,但是当我尝试执行以下操作时:

Response2 propResponse2 = MakeRequest2(propertyRequest2, sfToken);

foreach (string strId in propResponse2)
{
    System.Windows.Forms.MessageBox.Show(strId.Name)
}

我收到一条错误消息:

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

我认为这意味着我需要在类中的 DataContract 中添加一些内容,但我不确定在哪里执行此操作以便可以正确迭代。

有什么帮助吗?

【问题讨论】:

  • 您一定来自JavaScript 世界。 --- 我假设propResponse2 的类型是Response2?如果是这样,那么我假设您正在尝试遍历该类的数据成员? foreach 不会那样做。而且没有这样的野兽。我假设您正在尝试序列化课程。为此,请使用 DataContractSerializerNetDataContractSerializer
  • propResponse2 是如何定义的?
  • @UweKeim,从错误消息中很明显它被声明为Response2
  • @UweKeim - 我用定义更新了问题

标签: c# list loops datacontractserializer datacontract


【解决方案1】:
foreach (var resp3 in propResponse2.r3entry)
{
    System.Windows.Forms.MessageBox.Show(resp3.strName)
}

【讨论】:

  • 这可行,但需要更改为resp3.strName
【解决方案2】:

要做你想做的事(如果这确实是你想做的事)你需要使用reflection

        foreach (var field in propResponse2.GetType().GetFields())
        {
            System.Windows.Forms.MessageBox.Show(field.GetValue(propResponse2).ToString());
        }

另一方面,如果您想从所有字段中获取所有 [DataContract] 属性,那么:

foreach (DataContract dc in propResponse2.GetType()
            .GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
            .Where(m => m.GetCustomAttributes(typeof(DataContract), false).Length > 0)
            .SelectMany(m => m.GetCustomAttributes(false).OfType<DataContract>()).ToArray())
{
System.Windows.Forms.MessageBox.Show(dc.Name);

}

【讨论】:

  • 那么遍历这个列表有什么缺点呢?我不确定我是否理解为什么reflection 不好,而从所有字段中获取所有属性是好的?问题不在于我只想要“一些”属性,而是将其定义为一个列表,因此列表中有许多这些属性的“集合”,我想遍历这些单独的项目。跨度>
  • @gotmike:我没说reflection 不好。我只是不确定你想要什么。您想要propResponse2 字段的值还是想要DataContract.Name 值?反射肯定比编译时访问慢,但反射已在 C# 中进行了优化。 “问题”是,如果这是会被大量执行的代码,那么反射就是一个性能问题。
猜你喜欢
  • 2012-10-29
  • 2020-07-07
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2015-06-14
  • 2021-12-28
相关资源
最近更新 更多