【问题标题】:Is there an equivalent of "dynamic" type in VB.NET or other way to achieve the same behavior?VB.NET 中是否有等效的“动态”类型或其他方式来实现相同的行为?
【发布时间】:2021-02-04 14:41:59
【问题描述】:

我有一个 VB.NET 类库项目。它引用了一些带有 GuiComponent

的遗留库
 Public Function findById(id As String) As GuiComponent 
        Return session.FindById(id)
 End Function

在一个新的 C# 项目中,我想调用这个函数,我不想为它引用整个遗留库。 所以我用动态包装它

((dynamic)sth.findById("someId")).select

有没有办法在 VB.NET 中返回动态类型?

Public Function findById(id As String) As Dynamic 'something like this doesn't work
        Return session.FindById(id)
End Function

C# 等效

 public dynamic findById(string id) {
     return session.FindById(id);
 }

当然,我不想为整个项目关闭Option Strict

【问题讨论】:

  • "我不想为整个项目关闭 Option Strict。" - 无需。为需要后期绑定的代码创建一个包含“Option Strict Off”的部分类代码文件。这与 VB 使用后期绑定一样精细。
  • @TnTinMn,我认为Option Strict Off 只能在VB 中的一类中使用。在 C# 中可以吗?
  • @hiichaki,“Option Strict”不是类属性。它基于源文件和/或项目级别应用。源文件级别设置覆盖项目级别设置。我最初没有足够仔细地阅读您的问题,并且误解了您要做什么。在不验证它是否有效的情况下,Hans 提出的解决方案的一个更复杂的替代方案是将 GuiComponent 定义为继承自 DynamicObject

标签: c# .net vb.net


【解决方案1】:

在 VB.NET 中没有 dynamic 的等效项,返回类型必须是 Object。 CLR 也没有支持,但这里真正需要的是让 C# 编译器相信“对象”必须被解释为“动态”。换句话说,您需要在 VB.NET 中执行 C# 编译器在元数据中注释返回类型的操作。那只需要一个属性,如下所示:

Public Function findById(id As String) As <System.Runtime.CompilerServices.Dynamic> Object
        Return session.FindById(id)
End Function

【讨论】:

    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2018-04-10
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多