我有一个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类的反射中找到数据类型,但这远远超出我的知识。
答案 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来更好地捕获错误。
上次......这远非优雅,但它可以工作,你表示你可能想尝试一下,祝你好运,如果你遇到任何问题,请告诉我。