如何编写C#函数来接受可变数量的参数?

我有一个C#方法,我想用它来更新一些数据。 该方法可以传递一个字符串,一个double,一个整数

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类的reflection中找到数据类型,但这远远超出我的知识。

编辑

看起来您想要传入属性名称和值。 一点点反思应该让这很容易:

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

每个参数的所有validation逻辑也可以在此处输入。

 public void Update(UpdateInfo obj) { . . } 

首先,您似乎应该在一个自定义类中一次性传递所有这些值,而不是进行三次单独调用。 但如果这不是你想要或可以做的……

如果在函数调用之前可以将各种值都转换为字符串,则可以以这种方式传递它们。 事实上,如果它们来自文本框,它们可能已经是字符串开头。 如果你的第三个参数(例如“位置”,“床”)可以明确地指出你想要的数据类型,这应该可行,或者你也可以传递所需的数据类型。

如果需要传入整数值intVal:

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

然后在函数内部,您需要确定要插入的值是否应该是字符串以外的任何值并进行转换。 我建议使用Double.TryParse和Int32.TryParse来更好地捕获错误。

上次…这远非优雅,但它可以工作,你表示你可能想尝试一下,祝你好运,如果你遇到任何问题请告诉我。