我可以使用 CallByName 访问班次'子值(换句话说,我可以使用Class.SubValue
)。
但是当我想使用CallByName获取Class.SUBCLASS.SubValue
时,我会收到错误
是否可以使用CallByName(或使用smtg else)?
这是一个典型的代码:
Class Class1
Public someVariable as Long=123 'now "Class1" has "someVariable"
End Class
Class Class2
Public subClass as new Class1 'now "Class2" has a SUBCLASS "Class1"
End Class
Sub Test()
Dim c1 as New Class1, c2 as New Class2
'This works fine, and I can get c1.someVariable. It's OK.
a=CallByName(c1,"someVariable",CallType.Get)
'But I get error here... and I can't get c2.subClass.someVariable
b=CallByName(c2,"subClass.someVariable",CallType.Get)
End Sub
- 编辑:这是实际问题。 -
我想从文件中加载参数以形成控件,在文件中参数的写法如下:
<ControlName>.<Property>=<Value> | TextBox1.Text=SomeText | Button2.Left=1234
我使用时出错:
CallByName(MyForm, "<ControlName>.<Property>", CallType.Set, "<Value>")
如何解决我的问题(使用CallByName或smtg else)?
答案 0 :(得分:2)
我使用了这个简单的递归函数
Function RecursiveGetValue(ByVal Name As String, ByVal Data As Object) As Object
If Name.Contains(".") = True Then
RecursiveGetValue = RecursiveGetValue(Name.Substring(Name.IndexOf(".") + 1), CallByName(Data, Name.Split(".")(0), CallType.Get))
Else
RecursiveGetValue = CallByName(Data, Name, CallType.Get)
End If
结束功能
答案 1 :(得分:0)
我正在做类似的事情。我希望能够在SQL列名称中使用点符号来递归地填充对象层次结构。
Sub PopulateData(r As SqlDataReader)
For i As Integer = 0 To r.FieldCount - 1
If Len(r(i)) > 0 Then
Try
Dim ob As Object = Me
Dim name As String = r.GetName(i)
While InStr(name, ".") > 0
ob = CallByName(ob, Split(name, ".")(0), CallType.Get)
name = name.Substring(InStr(name, "."))
End While
CallByName(ob, name, CallType.Set, r(i))
Catch ex As Exception
Console.WriteLine("Missing property: {0}", r.GetName(i))
End Try
End If
Next
End Sub