【发布时间】:2012-06-22 02:38:21
【问题描述】:
所有,我有一个返回列表的方法。该方法用于根据名称返回 SQL StoredProcedures、Views 和 Functions 的参数。我想要做的是创建一个对象列表并将这个列表返回给调用者。方法如下
private List<T> GetInputParameters<T>(string spFunViewName)
{
string strSql = String.Format(
"SELECT PARAMETER_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.PARAMETERS " +
"WHERE SPECIFIC_NAME = '{0}' AND PARAMETER_MODE = 'IN';",
spFunViewName);
List<string[]> paramInfoList = new List<string[]>();
DataTable paramDt = Utilities.DTFromDB(conn, "InputParmaters", strSql);
if (paramDt != null)
{
Converter<DataRow, string[]> rowConverter =
new Converter<DataRow, string[]>(Utilities.RowColConvert);
paramInfoList = Utilities.ConvertRowsToList<string[]>(paramDt, rowConverter);
}
else
return null;
// Build the input parameter list.
List<T> paramList = new List<T>();
foreach (string[] paramInfo in paramInfoList)
{
T t = new T(paramInfo[NAME], paramInfo[TYPE], Convert.ToInt32(paramInfo[CHARMAXLEN]));
columnList.Add(column);
}
return columnList;
}
我显然无法通过new 实例化T 并传递给构造函数,但应该清楚我正在尝试做什么。有没有办法在没有另外三种方法的情况下做我想做的事?
注意。主要问题是我传递给 T 的参数数量可以是两个 OR 三。
感谢您的宝贵时间。
编辑:我使用的structs如下
public struct Database
{
public string name { get; set; }
public string filename { get; set; }
public List<Table> tables { get; set; }
public List<StoredProcedure> sps { get; set; }
public List<Function> funcs { get; set; }
public List<View> views { get; set; }
public Database(string name, string filename)
{
this.name = name;
this.filename = filename;
}
}
protected internal struct StoredProcedure
{
public string name { get; set; }
public List<string[]> parameters { get; set; }
public StoredProcedure(string name, List<string[]> parameters)
{
this.name = name;
this.parameters = parameters;
}
}
protected internal struct Function
{
public string name { get; set; }
public string output { get; set; }
public List<string[]> parameters { get; set; }
public Function(string name, string output, List<string[]> parameters)
{
this.name = name;
this.output = output;
this.parameters = parameters;
}
}
protected internal struct View
{
public string name {get; set;}
public List<string[]> parameters { get; set; }
public View(string name, List<string[]> parameters)
{
this.name = name;
this.parameters = parameters;
}
}
【问题讨论】:
-
T的类型是可能出现在这里? -
@Jon Skeet,实际上是
struct。我正在尝试构建一个可重用的树结构来显示数据库、表等,但我也希望能够再次使用从这个过程中获得的信息 - 所以我使用带有struct StoredProcedure、struct Function等的单例模式。谢谢. -
我想
"InputParmaters"是错字? -
我遇到的问题是,我花了这么多年时间编写 FORTRAN,以至于我经常发现很难看到最好的 OOP 方法是什么......
-
@Killercam:我看不出你有什么问题。您的方法旨在返回 parameters,所以让它这样做。然后调用者可以构造 StoredProcedure/Function/whatever。尽量避免在单一方法中做太多事情。