0

我们有一个 C# 类,其中包括两个函数,其参数仅通过参数修饰符不同:

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

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

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

在 VB.NET中将调用编写为DoSomething((myObj))(即添加括号)没有帮助。

4

2 回答 2

3

您可以创建一个用 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)
于 2018-01-03T19:23:27.053 回答
2

AFAIK,唯一的方法是使用反射强制调用 API。虽然我不完全确定这是否可行。

问题是创建 2 个仅不同的重载ref不符合 CLS,因此不能保证适用于所有 .NET 语言。为防止出现这种情况,您应该将CLSCompliantAttribute 添加到您的AssemblyInfo.cs文件中,然后编译器会在您破坏 CLS 兼容性时向您发出警告。

[assembly: System.CLSCompliant(true)]

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

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

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

有几种不同的方法可以使这个更干净,例如制作一个单独的程序集来包装它,就像 Scott Hannen 提到的那样,或者只是通过使 CLS 合规性的包装器方法成为扩展方法。

于 2018-01-03T19:17:22.523 回答