Được rồi, nhờ Alain và KyleNZ bây giờ tôi đã tìm ra cách làm việc để thực hiện điều này, mà không có một bộ sưu tập hoặc đối tượng đếm được dưới đây.
Về cơ bản, nhờ tên của! toán tử, tôi phát hiện ra rằng truy cập thông qua toán tử bang/pling tương đương với việc truy cập thành viên mặc định của một đối tượng. Nếu tài sản Value
là thành viên mặc định của mô-đun lớp học của tôi, sau đó có ba tuyên bố tương đương để truy cập tài sản đó:
obj.Value("param")
obj("param")
obj!param
Vì vậy, để thực hiện một cú pháp ngắn làm việc cho một mô-đun lớp tùy chỉnh, tất cả người ta phải làm là để xác định một thành viên mặc định.Ví dụ, bây giờ tôi sử dụng sau đây Value
tài sản:
Property Get Value(name As String) As String
Value = SomeLookupInMyXMLDocument(name)
End Property
Property Let Value(name As String, val As String) As String
SetSomeNodeValueInMyXMLDocument(name, val)
End Property
Thông thường, bây giờ bạn có thể truy cập vào đó như thế này:
obj.Value("foo") = "New value"
MsgBox obj.Value("foo")
Bây giờ để làm cho tài sản đó các thành viên mặc định, bạn cần phải thêm một dòng định nghĩa tài sản:
Attribute Value.VB_UserMemId = 0
Vì vậy, tôi kết thúc với điều này:
Property Get Value(name As String) As String
Attribute Value.VB_UserMemId = 0
Value = SomeLookupInMyXMLDocument(name)
End Property
Property Let Value(name As String, val As String) As String
Attribute Value.VB_UserMemId = 0
SetSomeNodeValueInMyXMLDocument(name, val)
End Property
Và sau đó, công trình này và tương đương với mã hiển thị ở trên:
obj("foo") = "New value"
MsgBox obj("foo")
' As well as
obj!foo = "New value"
MsgBox obj!foo
' Or for more complex `name` entries (i.e. with invalid identifier symbols)
obj![foo] = "New value"
MsgBox obj![foo]
Lưu ý rằng bạn phải thêm Attribute Value.VB_UserMemId = 0
trong một số biên tập viên khác hơn là trình soạn thảo VBA mà tàu với Microsoft Office, là một trong đó ẩn Attribute
chỉ thị vì một số lý do .. Bạn có thể dễ dàng xuất mô-đun, mở nó trong notepad, thêm chỉ thị và nhập lại vào trình soạn thảo VBA. Miễn là bạn không thay đổi quá nhiều với thành viên mặc định, không nên xóa chỉ thị (chỉ cần đảm bảo bạn kiểm tra theo thời gian trong trình chỉnh sửa bên ngoài).
Được rồi, cảm ơn cho đến nay .. nhưng có cách nào để sử dụng tính năng này mà không cần có từ điển/bộ sưu tập cơ bản không? Dữ liệu của tôi xuất phát từ một tệp XML và khóa chỉ mục mà tôi muốn sử dụng một phần dựa trên đường dẫn. – poke
Nếu thư viện XML của bạn hiển thị nội dung của các nút có liên quan dưới dạng từ điển, bạn có thể xác định thuộc tính trả về từ điển đó và đặt thuộc tính đó làm thành viên mặc định; nếu nó phức tạp hơn một chút, bạn có thể thử tạo một thuộc tính ánh xạ từ điển cho XPath cho các trường hợp cụ thể. Kỹ thuật này dựa hoàn toàn vào từ điển hoặc bộ sưu tập. – KyleNZ