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

Posted

技术标签:

【中文标题】如何从 C# 中的方法返回等效的 VB6 Variant 类型【英文标题】:How to return the equivalent of a VB6 Variant type from a method in C# 【发布时间】:2018-04-10 14:42:42 【问题描述】:

我有一个较旧的 VB6 应用程序,它有一个函数 RunReturningVAR,它是一个 db 调用,可以返回一个 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

【问题讨论】:

没有附加任何内容,但您可以返回一个object,这是一个变体。 对不起,我的问题是 为什么,哦,为什么,这是标记为 c# 的? @rory.ap 你读过这个问题吗? @rory.ap 是的,他们只说过一次他们正在尝试将 VB 代码写入 C#。为什么他们需要说不止一次? 【参考方案1】:

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);

等等。

【讨论】:

C#处理可选参数的方式很有意思 尊敬的投票者:您能否发表评论,说明我的回答有什么问题? 哇,非常感谢您提供有关可选的信息。我不知道。 @LeeHopkins 我认为很多开发人员并不知道这一点。在我使用 c# 的第一年,我对此一无所知,我只是偶然看到它在 *** 上进行了解释(但不记得那是很久以前的事了)。所以我觉得更多的人应该知道这一点,如果我回答有关具有可选参数的代码的问题,我确实会提到这一点(但大多数时候,更简单)

以上是关于如何从 C# 中的方法返回等效的 VB6 Variant 类型的主要内容,如果未能解决你的问题,请参考以下文章

VBA 等效于 C# 中的 List<T> [重复]

C# 句柄指针的 JFrame 等效项

如何将 System::^array 从 C# 函数转换为 C++ 中的等效数据类型

是否存在与VB6 Strconv等效的Java(Android)

C# 中的 Jaxb 等效项

C# 中的 Jaxb 等效项