我需要檢查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