簡體   English   中英

如何編寫C#函數以接受可變數量的參數?

[英]How can I code a C# function to accept a variable number of parameters?

我有一個C#方法,我想用它來更新一些數據。 該方法可以傳遞一個字符串,一個雙精度數,一個整數

public void Update(string ac, string pr, string fld, Int32 intVal = null, double dblVal = null, string strVal = null)
{

根據fld的值,我想更新表中的某個字段名稱。

有什么方法可以對函數參數進行編碼,從而不必提供一長串可能的值類型?

理想情況下,我希望能夠這樣調用此函數:

Update("key1", "key2", "location", "London");
Update("key1" , "key2", "beds", 2);
Update("key1" , "key2", "price", 123.45);

然后在函數更新中,我希望擁有:

public void Update(string ac, string pr, xxx, yyy)
    {
        try
        {
            vm.Product = _product.Get(ac, pr);
            vm.Product.xxx = yyy;
            _product.AddOrUpdate(vm.Product);
        }
        catch (Exception e) { log(e); }
    }

在xxx中,我想指定字段名稱,而yyy為實際值。 也許在函數內部,我可以使用基於字段名稱的case方法進行某種類型的轉換。 我只有少量的字段名稱,因此很容易。 也可能有一種方法可以從vm類的反射中找到數據類型,但這遠遠超出了我的理解。

編輯

看起來您想傳遞一個屬性名稱和一個值。 一點點思考應該使這變得容易:

public void Update(string ac, string pr, string propertyName, object Value) {
    try {
        vm.Product = _product.Get(ac, pr);
        vm.Product.GetType().GetProperty(propertyName).SetValue(vm.Product, value, null);
        _product.AddOrUpdate(vm.Product);
    }
}

結束編輯

params數組允許您的方法接受可變數量的參數

public void Update(string ac, string pr, params object[] arguments)

上面的任何示例都可以調用

Update("key1", "key2", "location", "London");
Update("key1" , "key2", "beds", 2);
Update("key1" , "key2", "price", 123.45);

如果可以通過這些參數之一 ,它聽起來並不像你想的變量數; 聽起來您想要三個不同的重載:

public void Update(string ac, string pr, string fld, Int32 intVal)
{

}

public void Update(string ac, string pr, string fld, double dblVal)
{

}

public void Update(string ac, string pr, string fld, string strVal)
{

}

我建議您的最佳方法是用Object替換所有參數。 所有這些參數將代表您要用來更新數據庫的一些信息

class UpdateInfo
{
  public string ac {get; set;}
  public string pr {get; set;}
  public string fld {get; set;}
  .
  .
  .
}

每個參數的所有驗證邏輯也可以在此處輸入。

public void Update(UpdateInfo obj)
{
 .
 .
}

首先,似乎您應該在一個自定義類中一次傳遞所有這些值,而不是進行三個單獨的調用。 但是,如果那不是您想要或不能做的...

如果在函數調用之前所有值都可以轉換為字符串,則可以通過這種方式傳遞它們。 實際上,如果它們來自文本框,則它們可能已經是開頭的字符串。 如果您的第三個參數(例如“ location”,“ beds”)可以明確指示您想要返回的數據類型,則該方法應該可以工作,或者您也可以傳入所需的數據類型。

如果您需要傳遞整數值intVal:

string strVal = intVal.ToString();
Update(ac, pr, fld, strVal);

然后,在函數內部,您需要確定要插入的值是否應該是字符串以外的任何其他值並將其轉換。 我建議使用Double.TryParse和Int32.TryParse更好地捕獲錯誤。

上次...這遠非優雅,但可以使用,您表示您可能想嘗試一下,祝您好運,如果遇到任何問題,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM