我正在尝试使用3.5框架将以下代码从C#传送到Vb。
以下是C#中我遇到问题的代码。
MethodInfo mi = typeof(Page).GetMethod("LoadControl", new Type[2] { typeof(Type), typeof(object[]) });
我认为在VB中会是这样的;
Dim mi As MethodInfo = GetType(Page).GetMethod("LoadControl", New Type(2) {GetType(Type), GetType(Object())})
但是我收到以下错误“数组初始化程序缺少1个元素”
我遇到麻烦并遇到同样错误的另一行是
control = (Control) mi.Invoke(this.Page, new object[2] { ucType, null });
我在vb中尝试了这个但是它不起作用。
control = DirectCast(mi.Invoke(Me.Page, New Object(2) {ucType, Nothing}), Control)
ucType定义如下
Dim ucType As Type = Type.[GetType](typeName(1), True, True)
非常感谢任何帮助。
答案 0 :(得分:6)
VB.Net数组是基于0的,但是使用最高索引而不是项目数来声明。因此,索引为0..9的10项数组被声明为Item(9)。
话虽如此,你的问题的真正解决方案是让编译器找出数组长度,如下所示:
Dim mi As MethodInfo = GetType(Page).GetMethod("LoadControl", New Type() {GetType(Type), GetType(Object())})
答案 1 :(得分:5)
在VB.NET中,数组声明采用数组的上限,而不是像C#那样的长度(如果你问我那么傻)。因此,您需要将传递到数组声明中的数量减少1(因为数组从零开始)。
答案 2 :(得分:3)
对于第一行,您需要将新的Type(2)更改为New Type(1)。
Dim mi As MethodInfo = GetType(Page).GetMethod("LoadControl", New Type(1) {GetType(Type), GetType(Object())})
在VB.Net中,数组初始值设定项中指定的数字是最高可访问索引与长度的关系。你提到的第二行有同样的问题和解决方案。
答案 3 :(得分:2)
VB使用上限作为数组的参数。
new byte[X]
new byte(X) 'wrong, 1 more element
new byte(X-1) 'correct, kinda confusing
new byte(0 to X-1) 'correct, less confusing
我建议使用(0到X-1)样式,因为它更清晰。在vb6天中,当数组(X)可以表示0到X或1到X时,这取决于上下文,这一点更为重要。
答案 4 :(得分:1)
就像这样 -
Dim mi As MethodInfo = GetType(Page).GetMethod("LoadControl", New Type(1) {GetType(Type), GetType(Object())})
另一个将是 -
control = DirectCast(mi.Invoke(Me.Page, New Object(1) {ucType, Nothing}), Control)
答案 5 :(得分:1)
http://converter.telerik.com有一个在线版本可供转换 C#到VB,反之亦然。