在下面的代码片段中,我的目的是将 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 >