位背景:我正在使用IQToolkit編寫使用System.Data.Odbc
而不是System.Data.SqlClient
的自定義數據提供程序。最簡單的方法來更改一個方法的行爲而不更改類?
我遇到了默認參數器類的問題,找到here。下面的代碼片段是我需要改變的,僅僅是一種方法。
int iParam = 0;
protected override Expression VisitConstant(ConstantExpression c)
{
if (c.Value != null && !IsNumeric(c.Value.GetType())) {
NamedValueExpression nv;
TypeAndValue tv = new TypeAndValue(c.Type, c.Value);
if (!this.map.TryGetValue(tv, out nv)) { // re-use same name-value if same type & value
string name = "p" + (iParam++);
nv = new NamedValueExpression(name, this.language.TypeSystem.GetColumnType(c.Type), c);
this.map.Add(tv, nv);
}
return nv;
}
return c;
}
我想過的幾種方法,我可以做到這一點,但我真的不喜歡任何人。
我有源代碼,所以我可以更改源代碼本身並重新編譯它。但是,這會爲其他SQL方言刪除一些有用的代碼,我不想爲了ODBC而毀掉所有這些。
我可以寫我自己的
Parameterizer
類,並使用它來代替默認值。如果我這樣做,我會重複250行代碼,以便更改三個或四個。我可以嘗試重寫該類,只更改我需要的方法。我嘗試過這個,但是我遇到了
Parameterizer
課程中的保護級別問題。我喜歡這個最好的,但我不確定我是否做得很對,或者我甚至可以用給定的課程設計。
道歉,如果這個問題似乎是模糊的,但對我有任何簡單的方法來改變方法的行爲,而不必更改基類或不復制其所有的代碼?
編輯:與#3問題:無法訪問IsNumeric
(私有Parameterizer
),無法訪問Parameterizer.map
,不能訪問結構TypeAndValue
,不能訪問Parameterizer.language
。
你遇到了什麼問題與選項#3?這對我來說似乎也是最好的選擇。 – Adrian 2013-04-09 18:24:35
@Adrian查看我的編輯。 'Parameterizer'中的所有保護級別問題。 – Mansfield 2013-04-09 18:28:26
我可能會關閉 - 但如果這是「訪問者」,那麼您可以實現自己的訪問者 - 除了「VisitConstant」之外,其他所有訪問者都可以調用默認的訪問者 - 然後實現該訪問者。 – NSGaga 2013-04-09 18:29:02