如何从 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 调用,可以返回一个 int
、string
、double
..... 但不是一个 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 类型的主要内容,如果未能解决你的问题,请参考以下文章
如何将 System::^array 从 C# 函数转换为 C++ 中的等效数据类型