W poniższym ujęciu moim zamiarem jest przekonwertowanie obiektu System.Object (który może być FSharpList) na listę dowolnego typowego dla niego typu.Jak rzutować obiekt na listę typu ogólnego w F #
match o with
| :? list<_> -> addChildList(o :?> list<_>)
| _ -> addChild(o)
Niestety tylko list<obj>
jest zawsze dopasowana w postaci listy. Chciałbym, aby list<Foo>
również zostało dopasowane jako lista.
Dla pewnego kontekstu próbuję przejść przez strukturę obiektu poprzez odbicie, aby zbudować TreeView klasy i jej dzieci. Rozważmy następującą klasę:
type Entity = {
Transform : Matrix
Components : obj list
Children : Entity list
}
Chciałbym zbudować drzewo, które pokaże mi wszystkie klasy zawarte w encji. Dzięki odbiciu mogę uzyskać wszystkie właściwości obiektu, a także ich wartości (Wartość jest ważna, ponieważ chcę wyświetlić różne elementy na liście z właściwością Nazwa elementu, jeśli ma on):
let o = propertyInfo.GetValue(obj, null)
Ta wartość może być listą pewnego typu, ale zwracana wartość to tylko System.Object Występują problemy podczas próby przekształcenia tego obiektu na listę. Jestem zmuszony wykonać następujące czynności:
match o with
| :? list<obj> -> addChildList(o :?> list<obj>)
| :? list<Entity> -> addChildList(o :?> list<Entity>)
| _ -> addChild(o)
Tutaj muszę podać dokładnie ten typ, który próbuję przekonwertować.
naprawdę chciałbym napisać to:
match o with
| :? list<_> -> addChildList(o :?> list<_>)
| _ -> addChild(o)
Niestety to tylko kiedykolwiek mecze na list<obj>
Czy naprawdę potrzebujesz wpisanej listy? Wydaje mi się, że dopasowanie "IEnumerable" wystarczy. –