如何从 C# 中的方法 return 等效于 VB6 变体类型

How to return the equivalent of a VB6 Variant type from a method in C#

我有一个较旧的 VB6 应用程序,它具有 RunReturningVAR 函数,它是一个数据库调用,可以 return intstringdouble... . 但不是 RecordSet。它的构建非常通用,因此它可以被多个其他函数调用,因此我们没有多个位置用于 DB 调用。 附上我目前拥有的。

Public Function RunReturningVar(ByVal vstrSql As String, _
Optional ByVal connval As Boolean = False, _
Optional ByVal copyID As Double = 0, _
Optional ByVal corpVal As Boolean = False, _
Optional ByVal vintConnectionTimeout As Integer = 30) As Variant

VB6 Variant (Can't believe I've found that link!) translates 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是一种特定于 late-binding,它可以容纳引用类型和值类型——不像 c# object 只能通过装箱容纳值类型。

请注意,使用 dynamic 意味着您绕过了所有编译时类型检查,这可能会导致 运行 时间错误,您通常不会从 c# 程序中预料到。

也许您可以使用泛型做得更好,但这需要您从调用方法中指定 return 类型:

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
}

此外,对于 public class 中的 public 方法,我 强烈建议不要在 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);
}

等等。