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语句无法对'ConsoleApplication1.Parameters'类型的变量进行操作,因为'ConsoleApplication1.Parameter'不包含GetEnumerator的公共定义。
答案 0 :(得分:3)
您的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();
}
}
答案 1 :(得分:2)
您的Parameters
类需要从Dictionary
继承,或者通过foreach
公开其内部词典进行枚举:
class Parameters {
Dictionary<int, int> paramids;
....
public Dictionary<int, int> ParamIDs {
get { return paramids; }
}
}
现在这样可行:
foreach (var param in d.ParamIDs) {
....
}
答案 2 :(得分:1)
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();
}
}
答案 3 :(得分:1)
如果您想将Parameters
类用作词典,请从Dictionary<int, int>
继承:
class Parameters: Dictionary<int, int>
{
}
但在这种情况下,最好只使用Dictionary<int, int>