更新
我有一个包含七个不同选项的下拉列表,例如(日期,主题,新闻,中央情报局,媒体......),用户将从下拉列表中选择一个项目,然后点击搜索按钮以获得结果。
这是我的存储库类GetInquiries方法,它接受7个参数,但它一次只传递一个参数到存储过程,如果是Date(它将从/到两个传递)
public List<Inquiry> GetInquiries(string fromDate, string toDate,
string subject, string press,
string cia, string media,
string status)
以下是我将参数传递给GetInquiries
的原因:
if (!string.IsNullOrEmpty(this.txtSubject.Text.Trim()))
{
e.Result = reporterRepo.GetInquiries(null,null,txtSubject.Text,null,null,null,null);
}
else
{
e.Result = reporterRepo.GetInquiries(null,null,null,null,null,null,null);
}
else if (!string.IsNullOrEmpty(this.fromDate.Text.Trim()))
e.Result = reporterRepo.GetInquiries(fromDate.Text,null,null,null,null,null,null)
.......................
...................
....................
对于所有七个参数,我必须继续七次(如果是条件的话)。
有没有办法可以更清晰,更可读?
答案 0 :(得分:3)
那么,根据您的具体情况,这可能有所帮助:
e.Result = reporterRepo.GetInquiries(null, null,
string.IsNullOrEmpty(this.txtSubject.Text.Trim()) ? null : txtSubject.Text,
null, null, null, null);
或者,如果你正在使用C#4并且可以修改GetInquiries
,你可以使所有参数都是可选的,并使用命名参数来指定你实际提供的参数。
或编写GetInquiriesByName
,GetInquiriesBySubject
等方法,以避免因冲突参数类型而导致重载。
编辑:如果有一个下拉列表,听起来你应该使用 的值来确定要采取的适当分支(即要搜索的内容),然后从那里开始。
答案 1 :(得分:1)
如果您使用的是.NET 4.0,那么您可以利用optional and default parameters。如果您使用的是早期的框架版本,请尝试创建例程的重载:
public List<Inquiry> GetInquiries(string fromDate, string toDate,
string subject, string press,
string cia, string media)
{
// Pass empty string for status.
return this.GetInquiries(fromDate, toDate, subject, press, cia, media, String.Empty)
}
public List<Inquiry> GetInquiries(string fromDate, string toDate,
string subject, string press,
string cia, string media,
string status)
答案 2 :(得分:0)
var subjectText = this.txtSubject.Text.Trim();
var dateText = this.fromDate.Text.Trim();
if (subjectText.Length == 0) subjectText = null;
if (dateText .Length == 0) dateText = null;
e.Result = reporterRepo.GetInquiries(dateText ,null,subjectText,
null,null,null,null);
string.IsNullOrEmpty(this.txtSubject.Text.Trim()))
请注意,this.txtSubject.Text.Trim()
永远不会为null,如果this.txtSubject.Text
为null,则会抛出异常。
答案 3 :(得分:0)
您只需使用第n个参数集调用方法GetInquiries即可。
public List<Inquiry> GetInquiries(int numparam, string myparameter)
{
object[] params = new object[7];
params[numparam] = myparameter;
reporterRepo.Gettype().GetMethod("GetInquiries").Invoke(reporterRepo, params);
}
我没有测试过代码但是你明白了。
答案 4 :(得分:0)
public class Inquiries
{
private SqlParameter[] _parameters;
public DateTime FromDate { get{ //return value from parameters array} set{ // add a new parameter to your array } }
public DateTime ToDate { get{ //return value from parameters array} set{ // add a new parameter to your array } }
public String Subject { get{ //return value from parameters array} set{ // add a new parameter to your array } }
public String Press { get{ //return value from parameters array} set{ // add a new parameter to your array } }
public String Cia { get{ //return value from parameters array} set{ // add a new parameter to your array } }
public String Media { get{ //return value from parameters array} set{ // add a new parameter to your array } }
public List<Inquiry> Get()
{
// Your dal code using the parameters array
}
}
然后以查询的形式查询会员级别,并根据您所做的更改,适当地设置属性,除非您一次只打算创建一个属性,然后创建类并抛出它每次使用它时:
List<Inquiry> myInquires = new Inquiry() { Subject = txtSubject.Text }.Get();
答案 5 :(得分:0)
所以在你的例子中,用法是
var querySpecification = new QuerySpecification();
if (!string.IsNullOrEmpty(this.txtSubject.Text.Trim()))
{
querySpecification = new WhereSubject().Is(txtSubject);
}
else if (!string.IsNullOrEmpty(this.fromDate.Text.Trim()))
{
querySpecification = new WhereFromDate().Is(fromDate);
}
else
{
querySpecification = new All();
}
e.Result = reporterRepo.GetInquiries(querySpecification);
WhereSubject,WhereFromDate和All派生自一个共同的IReportReposSpec。
public interface IReportReposSpec
{
void Is(object value)
// stored proc translation of the spec
string Param {get;}
string DbType {get;}
string Value {get;}
}
reportRepo.GetInquiries的实施可以是这样的
public List<Inquiry> GetInquiries(IReportReposSpec spec)
{
var cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
// for simplicity i'm going to use a pseudo code from here on
cmd.AddParam(spec.Param, spec.DbType, spec.Value));
//...
}