一点背景知识:我正在使用IQToolkit编写一个自定义数据提供程序,它使用System.Data.Odbc
而不是System.Data.SqlClient
.
我在此处找到的默认 Parameterizer 类遇到了问题。下面的代码片段是我需要更改的,仅相当于一种方法。
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
,不能访问 struct TypeAndValue
,不能访问Parameterizer.language
。