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

时间:2011-12-29 04:12:50

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

4 个答案:

答案 0 :(得分: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);
    }
}

结束编辑

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

答案 1 :(得分: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)
{

}

答案 2 :(得分:1)

我建议你的最好方法是用Object替换所有参数。所有这些参数都代表了您想要更新数据库的一些信息

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

每个参数的所有验证逻辑也可以在这里。

public void Update(UpdateInfo obj)
{
 .
 .
}

答案 3 :(得分:1)

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

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

如果需要传入整数值intVal:

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

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

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