En el siguiente fragmento de código, mi intención es convertir un System.Object (que podría ser una FSharpList) en una lista del tipo genérico que tenga.Cómo convertir un objeto en una lista de tipo genérico en F #
match o with
| :? list<_> -> addChildList(o :?> list<_>)
| _ -> addChild(o)
Desgraciadamente, sólo se list<obj>
jamás igualado en forma de lista. Me gustaría que list<Foo>
también coincida como una lista.
Por algún contexto, estoy tratando de atravesar una estructura de objeto por reflexión para construir una TreeView de la clase y sus elementos secundarios. Considere la siguiente clase:
type Entity = {
Transform : Matrix
Components : obj list
Children : Entity list
}
Me gustaría construir un árbol que me muestre todas las clases que contiene la entidad. A través de la reflexión, puedo obtener todas las propiedades de un objeto y sus valores (El valor es importante, ya que quiero mostrar los diferentes elementos en una lista con la propiedad Nombre del elemento si tiene uno):
let o = propertyInfo.GetValue(obj, null)
Este valor podría ser una lista de algún tipo, pero el valor devuelto es solo un System.Object Me encuentro con problemas al tratar de convertir este objeto a una lista. Estoy obligado a hacer lo siguiente:
match o with
| :? list<obj> -> addChildList(o :?> list<obj>)
| :? list<Entity> -> addChildList(o :?> list<Entity>)
| _ -> addChild(o)
Aquí tengo que especificar exactamente el tipo que estoy tratando de convertir.
Realmente me gustaría que escribir esto:
match o with
| :? list<_> -> addChildList(o :?> list<_>)
| _ -> addChild(o)
Desafortunadamente esto coincide con sólo alguna vez en list<obj>
¿Realmente necesita una lista mecanografiada? Me parece que emparejar 'IEnumerable' sería suficiente. –