2016-05-31 67 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

我不認爲這真的解決了這個問題。 –