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 的公共定义。
您的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();
}
}