代码之家  ›  专栏  ›  技术社区  ›  Eugene Mayevski 'Callback

VB。NET并调用byval/byref C#重载

  •  0
  • Eugene Mayevski 'Callback  · 技术社区  · 8 年前

    我们有一个C#类,它包括两个函数,其参数仅因参数修饰符不同而不同:

    bool DoSomething(Object obj){};
    bool DoSomething(ref Object obj){};
    

    现在我们需要从VB调用这个方法(实际上是其中的任何一个)。净额。问题是VB。NET编译器无法决定使用哪种方法。

    问题是:有没有办法告诉编译器我们想要第一个变量(或者第二个,这对调用方来说无关紧要)?

    将呼叫写入 DoSomething((myObj)) (即添加括号)在VB中。网络没有帮助。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Scott Hannen    8 年前

    您可以创建一个用C编写的单独库,该库提供具有不同名称的助手方法,使您能够调用定义不明确的 DoSomething 方法。你不应该这样做,人们可能会想知道你为什么这么做,所以你可以用尖刻的评论来解释为什么这是必要的。

    或者可以使用反射,大致如下:

    Dim methods = GetType(WhatEverTheType).GetMethods()
    Dim doSomethingMethod = methods.Single(Function(method As MethodInfo)
            Return method.Name = "DoSomething" _
            And Not method.GetParameters()(0).ParameterType.IsByRef
        End Function)
    doSomethingMethod.Invoke(instanceOfWhatEverTheType)
    
        2
  •  2
  •   NightOwl888 Jabrwoky    8 年前

    好吧,唯一的方法是使用反射强制调用API。虽然我不能完全确定这是否有效。

    问题是,创建2个重载的区别在于 ref 不符合CLS,因此不能保证完全正常工作。NET语言。为了避免陷入这种情况,您应该添加 CLSCompliantAttribute 到您的 AssemblyInfo.cs 文件,然后编译器将在您破坏CLS兼容性时发出警告。

    [assembly: System.CLSCompliant(true)]
    

    解决此问题的一种方法是添加一个可通过VB调用的包装函数。净额。

    bool DoSomething(Object obj){};
    bool DoSomething(ref Object obj){};
    
    // Call this method from VB.NET
    bool DoSomething2(ref Object obj)
    {
        return DoSomething(ref obj);
    }
    

    有几种不同的方法可以使它更干净,比如像ScottHannen提到的那样,制作一个单独的程序集来包装它,或者简单地将CLS遵从性的包装方法作为一个扩展方法。

    推荐文章