2016-05-31 38 views
1

我需要检查SqlParameter对象的值,并根据特殊标签对其进行更改。即:[BB] ==>棒球,[FP] ==> Fastpitch。覆盖新的SqlParameter

我可以像这样的附加功能做到这一点:

_params.Add(new SqlParameter("@Change", paramCheck(obj.Change))); 

我想尝试重写新的SqlParameter方法/功能,并在那里运行我的检查。我怎样才能做到这一点?

+2

待办事项在创建参数之前进行检查... – Alex

+0

在创建新参数之前,您需要某种数据层来检查当前值是什么 – 2016-05-31 13:06:04

回答

3

嗯,你不能字面上覆盖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)); 
2

如何建立一个扩展方法:

public static void Add(this SqlParameterCollection parms, SomeType obj) 
{ 
    // do some checks 

    // add the parameter 
} 

的这种用法,现在看起来是这样的:

_params.Add(obj); 

UPDATE:如下面帕特里克说,这里的问题是你怎么了如果它来自多种类型,请添加参数。如果不知道很多应答本身的答案不知道答案。

但是,如果对象共享一个接口,则接口可能是答案。如果他们是未知对象,反思可能是答案。这两者都难以实施。但是这种扩展方法为您提供了封装该实现的灵活性。

如果你最终不得不使用反射,帕特里克,因为在这一点上提出了一个很好的关注,您可能需要改变方法类似AddParamWithCheck的名字,你会接受一个object,而不是一个众所周知的类型。但是,这并不意味着me这个问题。

+2

您有风险调用如果参数与您的扩展方法不完全匹配,则为错误的方法。我建议使用另一个名称来清楚说明你所调用的版本。 –

+0

@PatrickHofman看看我对原文的修改。现在扩展方法只接受特定自定义类型的对象。 –

+0

我不认为这真的解决了这个问题。 –