在foreach循环中投射的问题

时间:2015-09-26 01:00:06

标签: c# asp.net

我在foreach循环中遇到问题。

我有以下代码,它由一个基本对象组成:

public class DBFieldMap
{
    public String fieldName { get; set; }
    public String fieldValue { get; set; }
    public DBFieldMap() { }
    public DBFieldMap(String fname, String fvalue)
    {
        fieldName = fname;
        fieldValue = fvalue;
    }
}

使用上述对象的词典

public class MappedSQLFields : Dictionary<String, DBFieldMap>
{
    public MappedSQLFields() 
    {
        this.Add("firstname", new DBFieldMap());
        this.Add("lastname", new DBFieldMap());
        this.Add("email", new DBFieldMap());
        etc...

    }
}

具有基于上述对象的属性的另一个对象

public class Audience : IEnumerable
{
...
        public MappedSQLFields audienceSQLMap
        {
            get;
            set;
        }
}

我希望能够循环遍历audienceSQLMap属性并提取DBFieldMap Dictionary对象的fieldName和fieldValue属性的值,但我收到了以下错误,尽管在&#34; foreach&#34 ;线。我尝试了各种明确的演员,但似乎仍然无法让CASTing发挥作用。

foreach (MappedSQLFields item in audience.audienceSQLMap)
{
    //Do something with item.fieldName and item.fieldValue
}
  

错误49无法转换类型   &#39; System.Collections.Generic.KeyValuePair&#39;至   &#39; MappedSQLFields&#39;

非常感谢任何帮助。谢谢。

SAGA继续

好的,现在上面的工作得益于以下所有人的帮助,现在我在将对象的JSON等效项转换回原始对象时遇到了问题。我收到了我最初收到的同样的错误,但是我已经尝试了我能想到的各种CAST语句,它仍然让我感到悲伤。我显然对这个话题缺少了一些东西。

这很好用:

var json = new JavaScriptSerializer().Serialize(audienceSQLMap);

此行错误:

this.audienceSQLMap = (MappedSQLFields)new JavaScriptSerializer().Deserialize(json,typeof(KeyValuePair<String, DBFieldMap>));

2 个答案:

答案 0 :(得分:3)

它希望你迭代一个键/值对。

修改代码以使用KeyValuePair<string, DBFieldMap>

foreach (KeyValuePair<string, DBFieldMap> item in audience.audienceSQLMap)

或者,更简洁,只需使用var

foreach (var item in audience.audienceSQLMap)
{
    //Do something with item.fieldName and item.fieldValue
    var name = item.Value.fieldName;
    var value = item.Value.fieldValue;
    ...
}

如果你需要的只是Dictionary的值,你可以迭代那些:

foreach (DBFieldMap map in a.audienceSQLMap.Values)
{
    var name = map.fieldName;
    var value = map.fieldValue;
    ...
}

答案 1 :(得分:1)

您发布的代码的关键部分是:

public class DBFieldMap
{
    public String fieldName { get; set; }
    public String fieldValue { get; set; }
    // elided
}

public class MappedSQLFields : Dictionary<String, DBFieldMap> { ... }

public class Audience
{
    public MappedSQLFields audienceSQLMap { get; set; }
}

但希望迭代audience.audienceSQLMap中的项目(我假设audienceAudience的实例)。

您可以利用audience.audienceSQLMapMappedSQLFields Dictionary<String, DBFieldMap>这一事实,而KeyValuePair<String, DBFieldMap>又是{{3}}的集合。

这里要做的是:

foreach ( IEnumerable<KeyValuePair<<String, DBFieldMap>> kvp in audience.audienceSQLMap )
{
    DBFieldMap map = kvp.Value;
    //Do something with map.fieldName and map.fieldValue
}