Nel seguente snippet, la mia intenzione è quella di convertire un oggetto System.Object (che potrebbe essere un elenco FSharp) in un elenco di qualsiasi tipo generico in esso contenuto.Come trasmettere un oggetto a un elenco di tipo generico in F #
match o with
| :? list<_> -> addChildList(o :?> list<_>)
| _ -> addChild(o)
Purtroppo solo list<obj>
è sempre abbinato come una lista. Vorrei che lo list<Foo>
corrispondesse anche a un elenco.
Per alcuni contesti, sto cercando di attraversare una struttura di oggetti per riflessione al fine di costruire un TreeView della classe e dei suoi figli. Considerare la seguente classe:
type Entity = {
Transform : Matrix
Components : obj list
Children : Entity list
}
Vorrei costruire un albero che mostri tutte le classi contenute nell'entità. Attraverso la riflessione, posso ottenere tutte le proprietà di un oggetto e anche i loro valori (Il valore è importante, dal momento che voglio visualizzare i diversi elementi in una lista con la proprietà Name dell'elemento se ne ha uno):
Questo valore potrebbe essere un elenco di un tipo, ma il valore restituito è solo un System.Object Si verificano problemi durante il tentativo di convertire questo oggetto in un elenco. Sono costretto a fare quanto segue:
match o with
| :? list<obj> -> addChildList(o :?> list<obj>)
| :? list<Entity> -> addChildList(o :?> list<Entity>)
| _ -> addChild(o)
Qui devo specificare esattamente il tipo che sto cercando di convertire.
Mi piacerebbe davvero scrivere questo:
match o with
| :? list<_> -> addChildList(o :?> list<_>)
| _ -> addChild(o)
Purtroppo questo corrisponde sempre e solo su list<obj>
Hai davvero bisogno di un elenco digitato? Mi sembra che l'abbinamento di "IEnumerable" sia sufficiente. –