如何转换给定的obj列表。
let l = [1. :> obj; 2. :> obj]
当在编译时不知道原始类型(在这种情况下为float)时,返回到float列表?
我已经尝试过(表明我对此知之甚少:)):
let t = (l |> List.head).GetType();
l |> List.map (fun e -> e :?> t)
这彻底失败了。
和
let castMe (ty : Type) (arr : obj list) =
let m = typeof<Enumerable>.GetMethod("Cast")
let m = m.MakeGenericMethod([|ty|])
m.Invoke(null, [|arr|]) :?> System.Collections.Generic.IEnumerable<_>
let t = (l |> List.head).GetType();
l |> castMe t;;
失败的原因:
错误FS0030:值限制。已推断值'it'具有通用类型val it:Generic.IEnumerable <'_ a>可以将'it'定义为简单的数据项,使其具有显式参数的功能,或者如果您不希望使用它,一般而言,添加类型注释。
============================================
编辑:
我将尝试解释我要实现的目标以及到目前为止的目标,因为也许我根本没有采取正确的方法。
这是我用来保存要为其提供类型的数据的结构。
type public InnerData(query, table) =
...
member __.Data = data // map <string, obj list>
member __.Headers = headers // Dictionary <string, Type>
这是我的类型提供程序的构造函数。
ty.AddMember(ProvidedConstructor([], InvokeCode = fun [] -> <@@ InnerData(queryParam, tableNameParam) :> obj @@>))
这就是我定义代表字典键的属性的方式。看一下评论。
do mdsTy.DefineStaticParameters([tableNameParam; queueryParam], fun tyName [| :? string as tableNameParam; :? string as queryParam |] ->
let ty = ProvidedTypeDefinition(
asm,
ns,
tyName,
baseType = Some(typeof<obj>))
let mdsInner = MdsData(mdsQueryParam, tableNameParam)
for header in mdsInner.Headers do
let columnName = header.Key
let columnType = header.Value
let arrayType = typedefof<IEnumerable<_>>.MakeGenericType(typeof<obj>)
// This works, but returns obj list. I would like to return a list of columnType that represents the downcasted version of arraytype.
let property = ProvidedProperty(columnName, arrayType,
GetterCode = fun [innerType] -> <@@ ((%%innerType:obj) :?> InnerData).Data.[columnName] @@>)
ty.AddMember(property)
在这里,我尝试使用上述方法(reflection和:?>)来投射数据,但是没有任何运气。
对此没有语法,因为正如Wesley Wiser指出的那样,使用这种表达式您无能为力。但是,由于要处理Expr
值,因此可以使用该Expr.Coerce
方法创建与所需值等效的表达式树。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句