在下面的代码片段中,我的目的是将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
}
我想构建一个树,显示包含在实体中的所有类。 通过反射,我可以获得对象的所有属性以及它们的值(该值非常重要,因为我希望在元素的名称属性列表中显示不同元素(如果它具有一个元素):
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'就足够了。 – 2010-01-26 17:44:45