有条件地传递参数

时间:2010-08-03 14:26:37

标签: c# asp.net

更新

我有一个包含七个不同选项的下拉列表,例如(日期,主题,新闻,中央情报局,媒体......),用户将从下拉列表中选择一个项目,然后点击搜索按钮以获得结果。

这是我的存储库类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)
     .......................
     ...................
      ....................

对于所有七个参数,我必须继续七次(如果是条件的话)。

有没有办法可以更清晰,更可读?

6 个答案:

答案 0 :(得分:3)

那么,根据您的具体情况,这可能有所帮助:

e.Result = reporterRepo.GetInquiries(null, null,
     string.IsNullOrEmpty(this.txtSubject.Text.Trim()) ? null : txtSubject.Text,
     null, null, null, null);

或者,如果你正在使用C#4并且可以修改GetInquiries,你可以使所有参数都是可选的,并使用命名参数来指定你实际提供的参数。

或编写GetInquiriesByNameGetInquiriesBySubject等方法,以避免因冲突参数类型而导致重载。

编辑:如果有一个下拉列表,听起来你应该使用 的值来确定要采取的适当分支(即要搜索的内容),然后从那里开始。

答案 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)

使用某种specification pattern

怎么样?

所以在你的例子中,用法是

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));

      //...
}