Гибкие параметры метода? - PullRequest
       2

Гибкие параметры метода?

2 голосов
/ 12 января 2012

У меня есть класс со следующим методом.

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 ]

3 голосов
/ 12 января 2012

Если вы используете dotnet 4.0 и выше, вы можете использовать дополнительные параметры.

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

Итак, с этого момента вы можете вызвать его следующим образом:

cIPLink( paramCaseNo );
cIPLink( paramCaseNo, paramContactID:5 );
2 голосов
/ 12 января 2012

Заставьте этот метод принимать значение nullable int? вместо простого int, измените код, чтобы обратить внимание на значения null в них, и добавьте три однострочные перегрузки, перенаправляющие вызовы в закрытый метод do-work.1004 *

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);
}
0 голосов
/ 12 января 2012

Вы можете просто установить значения по умолчанию для параметров равными нулю, а затем проверить и установить их в своей логике:

void method(int value = -1, string something = null) {
  if (value != -1) ... add parameter
  if (something != null) ... add parameter
}
0 голосов
/ 12 января 2012

Одна из идей заключается в том, чтобы переместить эти параметры в класс, что-то вроде:

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 параметров метода, а лучше преобразовать их в отдельный класс.

0 голосов
/ 12 января 2012

вы можете использовать параметры по умолчанию, такие как

public cIPLink(int paramCaseNo, string paramIPReference, int paramIPID = -1, int paramContactID = -1)
0 голосов
/ 12 января 2012

Используйте необязательные параметры при использовании C # 4.0

0 голосов
/ 12 января 2012

В 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;
}

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...