灵活的方法参数?

时间:2012-01-12 14:22:11

标签: c# sql

我有一个使用以下方法的课程。

public cIPLink(int paramCaseNo, int paramIPID, string paramIPReference, int paramContactID)
    {            
        this.cLinkDate = DateTime.Now;
        this.cCaseNo = paramCaseNo;
        this.cIPID = paramIPID;
        this.cIPReference = paramIPReference;
        this.cContactID = paramContactID;

        string strConnect = BuildConnectionString();
        SqlConnection linkToDB = new SqlConnection(strConnect);
        linkToDB.Open();

        string sqlStat = "INSERT INTO tblIPLinks (LinkID, LinkDate, CaseNo, IPID, ContactID, IPReference)" +
                         "VALUES (@LinkID, @LinkDate, @CaseNo, @IPID, @ContactID, @IPReference);";
        SqlCommand sqlCom = new SqlCommand(sqlStat, linkToDB);

        sqlCom.Parameters.Add("@LinkID", SqlDbType.Int);
        sqlCom.Parameters.Add("@LinkDate", SqlDbType.Date);
        sqlCom.Parameters.Add("@CaseNo", SqlDbType.Int);
        sqlCom.Parameters.Add("@IPID", SqlDbType.Int);
        sqlCom.Parameters.Add("@ContactID", SqlDbType.Int);
        sqlCom.Parameters.Add("@IPReference", SqlDbType.Text);

        this.cLinkID = NextLinkID();

        sqlCom.Parameters["@LinkID"].Value = this.cLinkID;
        sqlCom.Parameters["@LinkDate"].Value = this.cLinkDate;
        sqlCom.Parameters["@CaseNo"].Value = this.cCaseNo;
        sqlCom.Parameters["@IPID"].Value = this.cIPID;
        sqlCom.Parameters["@ContactID"].Value = this.cContactID;
        sqlCom.Parameters["@IPReference"].Value = this.cIPReference;

        sqlCom.ExecuteNonQuery();

        linkToDB.Close();
    }

但是我想让它更灵活一些。有时当调用该方法时,我想删除字段IPID,有时我想删除字段ContactID。现在我想到了复制和粘贴这段代码并有三种重载方法;一个只有IPID,一个只有ContactID,第三个有两个字段,但我确信必须有一种更简洁的方式来做我想要的。

有什么想法吗?

7 个答案:

答案 0 :(得分:3)

如果您使用的是dotnet 4.0及更高版本,则可以使用可选参数。

public cIPLink(int paramCaseNo, int paramIPID = -1, 
    string paramIPReference = null, int paramContactID = -1)

所以,从那一刻开始,您可以按如下方式调用它:

cIPLink( paramCaseNo );
cIPLink( paramCaseNo, paramContactID:5 );

答案 1 :(得分:2)

使此方法取为可空int?而不是普通int,更改代码以注意这些中的null值,并添加三个单行重载,将调用转发给do - 工作私人方法。

private void cIPLinkImpl(int paramCaseNo, int? paramIPID, string paramIPReference, int? paramContactID) {
    // Your implementation goes here.
    // check paramIPID and paramContactID to null before using them here
}

public void cIPLink(int paramCaseNo, int paramIPID, string paramIPReference, int paramContactID) {
    cIPLinkImpl(paramCaseNo, paramIPID, paramIPReference, paramContactID);
}

public void cIPLink(int paramCaseNo, string paramIPReference, int paramContactID) {
    cIPLinkImpl(paramCaseNo, null, paramIPReference, paramContactID);
}

public void cIPLink(int paramCaseNo, int paramIPID, string paramIPReference) {
    cIPLinkImpl(paramCaseNo, paramIPID, paramIPReference, null);
}

答案 2 :(得分:0)

使用C#4.0,您可以使用命名和可选参数。所以如果你有这样的方法:

static int CalculateBMI(int weight, int height)
{
    return (weight * 703) / (height * height);
}

你可以这样称呼它:

    Console.WriteLine(CalculateBMI(123, 64));

或者喜欢以下任何一种:

    Console.WriteLine(CalculateBMI(weight: 123, height: 64));
    Console.WriteLine(CalculateBMI(height: 64, weight: 123));

    Console.WriteLine(CalculateBMI(123, height: 64));

在声明上设置初始值使它们成为可选:

public int area(int height = 0, int width = 0)
{
    return height * width;
}

Source

答案 3 :(得分:0)

如果使用C#4.0

,请使用可选参数

答案 4 :(得分:0)

您可以使用默认参数,例如

public cIPLink(int paramCaseNo, string paramIPReference, int paramIPID = -1, int paramContactID = -1)

答案 5 :(得分:0)

其中一个想法是将这些参数移到类中,例如:

public class QueryParameters 
{
     public int? CaseNo {get;set;} 
     public int? IPID {get;set;} 
     public string IPReference {get;set;}
     public int? ContactID {get;set;}
}

然后,不是传递许多参数作为参数,而是传递QueryParameters类型的单个参数,并在传递给方法时填充QueryParameters的必需属性:

QueryParameters queryParameters = new QueryParameters();
queryParameters.IPReference = "blabla";

...

public cIPLink(QueryParameters queryParameters) 
{
    if (queryParameters.CaseNo.HasValue) {
        ....
    }
    ...
}

总的来说,建议使用方法,不要有更多的4-5方法参数,更好地将它们重构为单独的类。

答案 6 :(得分:0)

您可以将参数的默认值设置为null,然后在逻辑中检查并设置它们:

void method(int value = -1, string something = null) {
  if (value != -1) ... add parameter
  if (something != null) ... add parameter
}