2011-12-29 40 views
1

我有一個C#方法,我想用來更新一些數據。該方法可以傳遞一個字符串,雙,整數如何編碼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類的反射中找到數據類型,但這遠遠超出我的理解。

+0

您能否提供一些關於您的方法調用將如何顯示的示例? – BoltClock 2011-12-29 04:13:46

+0

你可以總是傳遞一個字符串,然後在函數內將其轉換爲int或double(例如Int32.Parse(strVal)),否則會在某些情況下導致精度問題? – nycdan 2011-12-29 04:17:06

+0

是的,我認爲總是傳遞一個字符串將工作。在函數內部,我只需要轉換爲所需的對象類型。我認爲這是一條好路。 – 2011-12-29 04:23:13

回答

4

編輯

它看起來像要在屬性名傳遞和值。反思一點點應該做這樣簡單:

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

編輯完

一個參數數組允許你的方法接受可變數量的參數

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

我總是有四個參數。只是不知道如何處理覆蓋,並選擇我應該使用哪一種或哪種數據類型。 – 2011-12-29 04:19:21

+0

@ Samantha2 - 請參閱我的編輯 – 2011-12-29 04:23:30

+0

有我認爲一個小錯誤,因爲它應該是vm.Product而不是vm中的設置。也沒有數據類型轉換。我會標記這個答案,因爲你的答案是我認爲最好的。我打開了另一個問題,特別提到了數據類型轉換。謝謝。 – 2011-12-29 11:18:40

1

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

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

} 
+0

是否可以將所有這些組合成一個使用「對象」?那麼有功能只是選擇適當的演員? – 2011-12-29 04:18:09

+0

你當然可以創建一個需要'object'的重載,但是你可以傳遞*任何東西*。如果您的選擇是採取三種選擇中的一種,那麼以這種方式使用超載是正確的選擇。你不能只有一個功能來做到這一點。 – 2011-12-29 04:38:20

1

我可以建議你的最佳方式是用一個對象替換所有參數。所有這些參數將代表其所要更新您的數據的基礎上對每個參數

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

你所有的驗證邏輯,也可以去這裏的一些信息。

public void Update(UpdateInfo obj) 
{ 
. 
. 
} 
1

首先,看起來你應該在一次定製類中傳遞所有這些值,而不是進行三次獨立的調用。但如果這不是你想要或可以做到的......

如果你的各種值都可以在函數調用之前轉換成字符串,那麼你可以用這種方式傳遞它們。事實上,如果他們來自文本框,他們可能已經是字符串開始。如果你的第三個參數(例如「位置」,「牀位」)可以明確指出您想要的數據類型,這應該可以工作,或者您也可以傳遞所需的數據類型。

如果你需要在一個整數值INTVAL經過:

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

然後你的函數裏面,你需要確定,如果你要插入的值應該是字符串以外的任何東西,並將其轉換。我建議使用Double.TryParse和Int32.TryParse更好地捕捉錯誤。

最後一次...這是遠遠優雅,但它可以工作,你表示你可能想嘗試它,所以祝你好運,讓我知道,如果你遇到任何問題。

相關問題