我有一个较旧的VB6应用程序,它具有RunReturningVAR函数,它是一个db调用,可以返回int
,string
,double
.....但不是{{ 1}}。它的构建非常通用,因此可以通过多个其他函数调用它,因此我们没有多个DB调用位置。
我目前拥有的是附件。
RecordSet
答案 0 :(得分:7)
VB6 Variant
(无法相信我发现该链接!)会翻译c#dynamic
。
public dynamic RunReturningVar(
string vstrSql,
bool connval = false,
double copyID = 0,
bool corpVal = false,
int vintConnectionTimeout = 30)
{
// do your stuff here
}
它几乎转换为object
,但Variant
是特定于的数据类型
后期绑定,它可以保存引用类型和值类型 - 不像c#object
只能通过装箱来保存值类型。
请注意,使用dynamic
意味着您可以绕过所有编译时类型检查,这可能会导致您通常无法从c#程序中获得的运行时错误。
也许你可以用泛型做得更好,但这需要你从调用方法中指定返回类型:
public T RunReturningVar<T>(
string vstrSql,
bool connval = false,
double copyID = 0,
bool corpVal = false,
int vintConnectionTimeout = 30) where T : new()
{
// do your stuff here and return T
}
另外,对于公共类中的公共方法,我强烈建议不要在c#中使用可选参数。
使用方法重载指定默认值。
原因是可选参数在c#中的工作方式:
当调用带有可选参数的方法并省略可选参数时,它的默认值将被编译到方法调用中。
因此,如果从另一个程序集调用此方法,则省略一些可选参数 - 如下所示:
yourObjectReference.RunReturningVar(sql, true);
c#编译器实际上将其转换为:
yourObjectReference.RunReturningVar(sql, true, 0, false, 30);
这意味着如果您想要更改任何参数的默认值,则还应重新编译引用此参数的其他程序集。 因此,更好的选择是使用方法重载:
public dynamic RunReturningVar(
string vstrSql,
bool connval,
double copyID,
bool corpVal,
int vintConnectionTimeout)
{
// do your stuff here
}
public dynamic RunReturningVar(
string vstrSql,
bool connval,
double copyID,
bool corpVal
)
{
return RunReturningVar(vstrSql, connval, copyID, corpVal, 30);
}
public dynamic RunReturningVar(
string vstrSql,
bool connval,
double copyID,
)
{
return RunReturningVar(vstrSql, connval, copyID, false);
}
等等。