Trong đoạn sau, ý định của tôi là chuyển đổi System.Object (có thể là một FSharpList) thành một danh sách của bất kỳ kiểu generic nào mà nó đang nắm giữ.Làm thế nào để đưa một đối tượng vào danh sách loại chung trong F #
match o with
| :? list<_> -> addChildList(o :?> list<_>)
| _ -> addChild(o)
Đáng tiếc là chỉ list<obj>
là bao giờ xuất hiện như một danh sách. Tôi muốn list<Foo>
cũng được kết hợp dưới dạng danh sách.
Đối với một số ngữ cảnh, tôi đang cố gắng duyệt qua một cấu trúc đối tượng bằng cách phản ánh để xây dựng TreeView của lớp và con của nó. Hãy xem xét các lớp sau:
type Entity = {
Transform : Matrix
Components : obj list
Children : Entity list
}
Tôi muốn xây dựng một cây hiển thị cho tôi tất cả các lớp được chứa trong thực thể. Thông qua phản ánh, tôi có thể có được tất cả các thuộc tính của đối tượng và giá trị của chúng (Giá trị là quan trọng, vì tôi muốn hiển thị các phần tử khác nhau trong danh sách có thuộc tính Tên của phần tử nếu có):
let o = propertyInfo.GetValue(obj, null)
Giá trị này có thể là danh sách loại nào đó, nhưng giá trị trả lại chỉ là System.Object Tôi gặp sự cố khi cố chuyển đổi đối tượng này thành danh sách. Tôi buộc phải làm như sau:
match o with
| :? list<obj> -> addChildList(o :?> list<obj>)
| :? list<Entity> -> addChildList(o :?> list<Entity>)
| _ -> addChild(o)
Ở đây tôi phải chỉ định chính xác loại mà tôi đang cố chuyển đổi.
Tôi thực sự muốn viết những dòng này:
match o with
| :? list<_> -> addChildList(o :?> list<_>)
| _ -> addChild(o)
Đáng tiếc là điều này chỉ phù hợp với từng trên list<obj>
Bạn có thực sự cần danh sách đã nhập không? Dường như với tôi kết hợp 'IEnumerable' sẽ đủ. –