在下面的代码片段中,我的目的是将System.Object(可以是FSharpList)转换为它所持有的任何泛型类型的列表.
match o with
| :? list<_> -> addChildList(o :?> list<_>)
| _ -> addChild(o)
Run Code Online (Sandbox Code Playgroud)
不幸的是,只有list<obj>匹配列表.我也想list<Foo>作为一个列表进行匹配.
对于某些上下文,我试图通过反射遍历对象结构,以便构建类及其子类的TreeView.考虑以下课程:
type Entity = {
Transform : Matrix
Components : obj list
Children : Entity list
}
Run Code Online (Sandbox Code Playgroud)
我想构建一个树,向我展示实体中包含的所有类.通过反射,我可以获得对象的所有属性及其值(值很重要,因为我想在列表中显示元素的Name属性,如果有的话):
let o = propertyInfo.GetValue(obj, null)
Run Code Online (Sandbox Code Playgroud)
此值可能是某种类型的列表,但值返回只是一个System.Object我在尝试将此对象转换为列表时遇到问题.我被迫做以下事情:
match o with
| :? list<obj> -> addChildList(o :?> list<obj>)
| :? list<Entity> -> addChildList(o :?> list<Entity>)
| _ -> addChild(o)
Run Code Online (Sandbox Code Playgroud)
在这里,我必须准确指定我要转换为的类型.
我真的想写这个:
match o with
| :? list<_> -> addChildList(o :?> list<_>)
| _ -> …Run Code Online (Sandbox Code Playgroud) match value with
| :? list<#SomeType> as l -> l //Is it possible to match any list of a type derived from SomeType?
| _ -> failwith "doesn't match"
Run Code Online (Sandbox Code Playgroud) 我有一个令人沮丧的问题.我正在ASP.NET MVC中构建一个视图引擎,并正在实现接口IViewEngine.在其中一种方法中,我试图动态地找出视图结果的类型.有时结果是模板(类型为Template <'key>).密钥用于在模板中定位占位符,其目的是使用区分联合,可能对每个网站都是唯一的.它可能看起来像这样:
type MasterKey = | HeadContent | HeaderContent | MainContent | FooterContent
let MasterTemplate : Template<MasterKeys> = ...
Run Code Online (Sandbox Code Playgroud)
现在,问题是这样的:因为我正在实现一个接口,所以我无法控制方法签名.由于我无法添加泛型类型参数,因此'a'将转换为obj,而下面的模板将不匹配:
match result with
| :? foo -> ...
| :? bar -> ...
| :? Template<'a> -> ...
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一个表示原始类型的区分工会:
type Expr =
| Int of bigint
| Real of float
| Symbol of string
| Bool of bool
| List of Expr list
Run Code Online (Sandbox Code Playgroud)
我正在编写一个函数list : obj list -> Expr list,该函数将检查对象的类型并将其相应地转换为Expr:
let rec list : (obj list -> Expr list) = function
| head::tail ->
match head with
| :? string as x'-> Symbol (x') :: list tail
| :? int as x'-> Int(bigint x') :: list tail
| :? bigint as x' -> Int …Run Code Online (Sandbox Code Playgroud)