C# 对于每个错误

本文关键字:错误 于每个 | 更新日期: 2023-09-27 18:09:01

string connection = "Data Source=" + server + ";Initial Catalog=" + dbase + 
";User ID=" + userid + ";Password=" + password;
conn = new SqlConnection(connection);
conn.Open();
SqlCommand cmd = new SqlCommand("SUBNETTEMP", conn);
cmd.CommandType = CommandType.StoredProcedure;
Parameters d = new Parameters();
d.addparam(15, 1);
d.addparam(15, 2);
foreach (var param in d)
{
    cmd.Parameters.Add(new SqlParameter(param.Key, param.Value));
} 

有一个名为参数的类:

class Parameters
{
    Dictionary<int, int> paramids;
    public Dictionary<int, int> addparam(int sid, int sbid)
    {
        if (paramids == null)
            paramids = new Dictionary<int, int>();
        paramids.Add(sid, sbid);
        return paramids;
    }
}

我不确定为什么我会收到错误:"foreach 语句无法对类型为"控制台应用程序 1.参数"的变量进行操作,因为"控制台应用程序 1.参数"不包含 GetEnumerator 的公共定义。

C# 对于每个错误

您的Parameters类没有GetEnumerator方法。就像错误说的那样。

您可以遍历paramids字段,但为此您需要公开它,这是IMO的坏主意。

另一种方法是实现GetEnumerator,将其转发给paramids.GetEnumerator

public IEnumerator<KeyValuePair<int,int>> GetEnumerator()
{
    return paramids.GetEnumerator();
}

为了更好地衡量,您还应该添加和实现 IEnumerable<KeyValuePair<int,int>>IEnumerable 接口,即使它们对于简单的foreach不是必需的。


作为旁注:我认为将内部字典公开为addparam的返回值是一个可疑的设计选择。如果你想要一个流畅的API,请返回你自己的Parameters实例,而不是内部字典。即使用return this.

此外,我会使用 .net 命名约定,因此请调用您的方法AddParam而不是addparam


所以你完整的课程将是:

class Parameters:IEnumerable<KeyValuePair<int,int>>
{
    Dictionary<int, int> paramids;
    public Parameters AddParam(int sid, int sbid)
    {
        if (paramids == null)
            paramids = new Dictionary<int, int>();
        paramids.Add(sid, sbid);
        return this;
    }
    public IEnumerator<KeyValuePair<int,int>> GetEnumerator()
    {
        return paramids.GetEnumerator();
    }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

你的Parameters类需要从Dictionary继承,或者公开其内部字典以通过foreach枚举:

class Parameters {
    Dictionary<int, int> paramids;
    ....
    public Dictionary<int, int> ParamIDs {
        get { return paramids; }
    }
}

所以现在这将起作用:

foreach (var param in d.ParamIDs) {
....
}

如果你想将你的Parameters类用作字典 - 从Dictionary<int, int>继承它:

class Parameters: Dictionary<int, int>
{
}

但在这种情况下,最好只使用Dictionary<int, int>

Parameters没有

GetEnumerator()?的方法,这是foreach循环集合所依赖的方法。您应该重构Parameters类(为此使用单独的类看起来有点过度(并直接使用Dictionary<>

另一种方法是让Parameters实现GetEnumerator()

class Parameters
{
    Dictionary<int, int> paramids;
    public Dictionary<int, int> addparam(int sid, int sbid)
    {
        if (paramids == null)
            paramids = new Dictionary<int, int>();
        paramids.Add(sid, sbid);
        return paramids;
    }
    public IEnumerator<KeyValuePair<int, int>> GetEnumerator() 
    { 
        return paramids.GetEnumerator(); 
    }
}
相关文章: