我们有一个C#类,它包含两个函数,它们的参数只有参数修饰符:
bool DoSomething(Object obj){};
bool DoSomething(ref Object obj){};
现在我们需要从VB.NET中调用这个方法(实际上是其中任何一个)。问题是VB.NET编译器无法决定使用哪种方法。
问题是:有没有办法告诉编译器我们想要第一个变体(或第二个变量,它对调用者来说并不重要)?
在VB.NET中将呼叫写为DoSomething((myObj))
(即添加括号)并没有帮助。
答案 0 :(得分:3)
您可以创建一个用C#编写的单独库,它提供具有不同名称的辅助方法,使您可以调用模糊定义的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)
方法。你不应该这样做,人们可能想知道你为什么这样做,所以你可以用尖刻的评论来解释它为什么是必要的。
或者你可以使用反射,大概是这样的:
{{1}}
答案 1 :(得分:2)
AFAIK,唯一的方法是使用Reflection强制调用API。虽然我不完全确定这是否有用。
问题是创建仅仅load: Centipede can't be instantiated.
java.lang.InstantiationException: Centipede
at java.lang.Class.newInstance(Class.java:427)
at sun.applet.AppletPanel.createApplet(AppletPanel.java:799)
at sun.applet.AppletPanel.runLoader(AppletPanel.java:728)
at sun.applet.AppletPanel.run(AppletPanel.java:378)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoSuchMethodException: Centipede.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
... 4 more
不同的2个重载不符合CLS,因此无法保证在所有.NET语言中都能使用。为了防止遇到这种情况,您应该将CLSCompliantAttribute添加到ref
文件中,然后编译器会在您破坏CLS兼容性时发出警告。
AssemblyInfo.cs
你可以通过添加一个可以通过VB.NET调用的包装函数来解决这个问题。
[assembly: System.CLSCompliant(true)]
有一些不同的方法可以使这个更清洁,例如像Scott Hannen提到的那样单独组装它,或者只是通过使CLS合规的包装方法成为扩展方法。