我需要检查SqlParameter对象的值,并根据特殊标签对其进行更改。即:[BB] ==>棒球,[FP] ==> Fastpitch。覆盖新的SqlParameter
我可以像这样的附加功能做到这一点:
_params.Add(new SqlParameter("@Change", paramCheck(obj.Change)));
我想尝试重写新的SqlParameter方法/功能,并在那里运行我的检查。我怎样才能做到这一点?
我需要检查SqlParameter对象的值,并根据特殊标签对其进行更改。即:[BB] ==>棒球,[FP] ==> Fastpitch。覆盖新的SqlParameter
我可以像这样的附加功能做到这一点:
_params.Add(new SqlParameter("@Change", paramCheck(obj.Change)));
我想尝试重写新的SqlParameter方法/功能,并在那里运行我的检查。我怎样才能做到这一点?
嗯,你不能字面上覆盖new SqlParameter
因为SqlParameter
is sealed
,但您可以创建一个返回新SqlParameter
功能:
public SqlParameter NewSqlParameter(string name, object value)
{
return new SqlParameter(name, paramCheck(value));
}
,并调用它是这样:
_params.Add(NewSqlParameter("@Change", obj.Change));
如何建立一个扩展方法:
public static void Add(this SqlParameterCollection parms, SomeType obj)
{
// do some checks
// add the parameter
}
的这种用法,现在看起来是这样的:
_params.Add(obj);
UPDATE:如下面帕特里克说,这里的问题是你怎么了如果它来自多种类型,请添加参数。如果不知道很多应答本身的答案不知道答案。
但是,如果对象共享一个接口,则接口可能是答案。如果他们是未知对象,反思可能是答案。这两者都难以实施。但是这种扩展方法为您提供了封装该实现的灵活性。
如果你最终不得不使用反射,帕特里克,因为在这一点上提出了一个很好的关注,您可能需要改变方法类似AddParamWithCheck
的名字,你会接受一个object
,而不是一个众所周知的类型。但是,这并不意味着me这个问题。
您有风险调用如果参数与您的扩展方法不完全匹配,则为错误的方法。我建议使用另一个名称来清楚说明你所调用的版本。 –
@PatrickHofman看看我对原文的修改。现在扩展方法只接受特定自定义类型的对象。 –
我不认为这真的解决了这个问题。 –
待办事项在创建参数之前进行检查... – Alex
在创建新参数之前,您需要某种数据层来检查当前值是什么 – 2016-05-31 13:06:04