В следующем фрагменте я намерен преобразовать System.Object (который может быть FSharpList) в список любого общего типа, который он удерживает.Как передать объект в список общего типа в F #
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>
Вам действительно нужен типизированный список? Мне кажется, что совпадение с 'IEnumerable' было бы достаточно. –