F#强制转换为在编译时未知的类型

克拉克

如何转换给定的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和:?>)来投射数据,但是没有任何运气。

v

对此没有语法,因为正如Wesley Wiser指出的那样,使用这种表达式您无能为力。但是,由于要处理Expr值,因此可以使用该Expr.Coerce方法创建与所需等效的表达式树。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

F#:强制转换为通用类型

来自分类Dev

F#:强制转换为通用类型

来自分类Dev

在编译时如何未知对象类型?

来自分类Dev

在编译时强制HList类型的上限

来自分类Dev

是否可以在编译时将Foo强制转换为ubyte [size]?

来自分类Dev

Delphi在编译时复制基类型未知的通用对象

来自分类Dev

序列化在编译时类型未知的对象

来自分类Dev

在编译时推导出未知类型的函数重载

来自分类Dev

如何强制转换为未知类型,需要强制转换为GenericType,但是T未知

来自分类Dev

在C#中强制转换为未知类型的反射

来自分类Dev

将List <Object>强制转换为未知类型

来自分类Dev

将List <Object>强制转换为未知类型

来自分类Dev

将对象强制转换为未知数据类型

来自分类Dev

在编译时在const结构类型之间进行转换

来自分类Dev

F#将obj [,]强制转换为float [,]

来自分类Dev

将作为通用类型参数的运行时Dictionary <K,V>强制转换为其正确的编译时类型

来自分类Dev

出现错误-在编辑数据类型为bit的状态列时,无法将对象从DBNull强制转换为其他类型

来自分类Dev

如何使用AutoFixture生成在编译时未知的任意类型的存根对象

来自分类Dev

如何在编译时强制执行非泛型类型

来自分类Dev

常量和重新解释强制转换是否在编译时发生?

来自分类Dev

在编译CUDA文件时从Clang编译器中的___ attribute ___((shared))转换为addrspace(3)

来自分类Dev

转换类型 F#

来自分类Dev

将基础转换为派生类时,在编译时不抛出错误

来自分类Dev

将基础转换为派生类时,在编译时不抛出错误

来自分类Dev

强制转换为较小类型时,C ++会截断

来自分类Dev

将类型强制转换为结构指针时出错

来自分类Dev

强制转换为定义的C#类型时发生InvalidCastException

来自分类Dev

在编译时遍历函数参数类型

来自分类Dev

Haskell:在编译时引用值的类型

Related 相关文章

  1. 1

    F#:强制转换为通用类型

  2. 2

    F#:强制转换为通用类型

  3. 3

    在编译时如何未知对象类型?

  4. 4

    在编译时强制HList类型的上限

  5. 5

    是否可以在编译时将Foo强制转换为ubyte [size]?

  6. 6

    Delphi在编译时复制基类型未知的通用对象

  7. 7

    序列化在编译时类型未知的对象

  8. 8

    在编译时推导出未知类型的函数重载

  9. 9

    如何强制转换为未知类型,需要强制转换为GenericType,但是T未知

  10. 10

    在C#中强制转换为未知类型的反射

  11. 11

    将List <Object>强制转换为未知类型

  12. 12

    将List <Object>强制转换为未知类型

  13. 13

    将对象强制转换为未知数据类型

  14. 14

    在编译时在const结构类型之间进行转换

  15. 15

    F#将obj [,]强制转换为float [,]

  16. 16

    将作为通用类型参数的运行时Dictionary <K,V>强制转换为其正确的编译时类型

  17. 17

    出现错误-在编辑数据类型为bit的状态列时,无法将对象从DBNull强制转换为其他类型

  18. 18

    如何使用AutoFixture生成在编译时未知的任意类型的存根对象

  19. 19

    如何在编译时强制执行非泛型类型

  20. 20

    常量和重新解释强制转换是否在编译时发生?

  21. 21

    在编译CUDA文件时从Clang编译器中的___ attribute ___((shared))转换为addrspace(3)

  22. 22

    转换类型 F#

  23. 23

    将基础转换为派生类时,在编译时不抛出错误

  24. 24

    将基础转换为派生类时,在编译时不抛出错误

  25. 25

    强制转换为较小类型时,C ++会截断

  26. 26

    将类型强制转换为结构指针时出错

  27. 27

    强制转换为定义的C#类型时发生InvalidCastException

  28. 28

    在编译时遍历函数参数类型

  29. 29

    Haskell:在编译时引用值的类型

热门标签

归档