如何从C#中的方法返回VB6 Variant类型的等价物

时间:2018-04-10 14:42:42

标签: c# vb6 variant

我有一个较旧的VB6应用程序,它具有RunReturningVAR函数,它是一个db调用,可以返回intstringdouble .....但不是{{ 1}}。它的构建非常通用,因此可以通过多个其他函数调用它,因此我们没有多个DB调用位置。 我目前拥有的是附件。

RecordSet

1 个答案:

答案 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);
}

等等。