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