【发布时间】:2014-08-25 12:35:23
【问题描述】:
let o1 = box SomeType()
let t = typeof<SomeType>
是否可以使用存储在其他对象 (o1) 中的类型信息来向下转换(到 SomeType)一个装箱对象 (o1)?
最终目标是对函数进行一种动态调用。 我在地图中存储带有签名 FSharpFunc 的函数:
// Lack of Covariance/Contravariance force me to define it as obj:
let functions = Map<string,obj>
let invoke f (pre : 'Pre when 'Pre : comparison) (post : 'Post when 'Post : comparison) =
(unbox<FSharpFunc<'Pre,'Post>> f).Invoke(pre)
每当我在 pre 和 post 中传递正确的类型对象时,此动态调用都会起作用。
知道问题来了。我在表单的映射中也有调用的参数:
let data = Map<string,obj>
let conf = Map<string, Type>
其中 conf 存储数据中每个可能的字符串键的类型。
因此,给定一个功能键和适当的配置,我可以从数据中检索参数以提供功能。但是为了使这些工作,我应该能够使用 conf Types 向下转换数据值。
我怀疑这是不可能的,我知道我正在绕过静态类型安全(我同意)。在这种情况下,任何解决方法或替代方法?
【问题讨论】:
-
我认为使用反射调用
Invoke函数是最简单的。那么你甚至不需要投射。 -
是的,这可能是最好的选择。我只是尽可能地坚持静态类型,希望性能更好。
标签: f#