В следующем фрагменте я собираюсь преобразовать объект System.Object (который может быть FSharpList) в список любого универсального типа, который он содержит.
match o with
| :? list<_> -> addChildList(o :?> list<_>)
| _ -> addChild(o)
К сожалению, только list<obj>
соответствует списку. Я бы хотел, чтобы list<Foo>
также соответствовало списку.
Для некоторого контекста я пытаюсь обойти структуру объекта путем отражения, чтобы построить TreeView класса и его дочерних элементов. Рассмотрим следующий класс:
type Entity = {
Transform : Matrix
Components : obj list
Children : Entity list
}
Я хотел бы построить дерево, которое показывает мне все классы, содержащиеся в сущности.
С помощью отражения я могу получить все свойства объекта, а также их значения (значение важно, поскольку я хочу отображать различные элементы в списке со свойством Name элемента, если оно есть):
let o = propertyInfo.GetValue(obj, null)
Это значение может быть списком некоторого типа, но возвращаемое значение является просто System.Object
Я сталкиваюсь с проблемами при попытке преобразовать этот объект в список. Я вынужден сделать следующее:
match o with
| :? list<obj> -> addChildList(o :?> list<obj>)
| :? list<Entity> -> addChildList(o :?> list<Entity>)
| _ -> addChild(o)
Здесь я должен указать именно тот тип, в который я пытаюсь конвертировать.
Я действительно хотел бы написать это:
match o with
| :? list<_> -> addChildList(o :?> list<_>)
| _ -> addChild(o)
К сожалению, это только когда-либо совпадало на list< obj >