将obj转换为通用F#接口

时间:2011-11-14 01:14:40

标签: interface f# sequences

我正在尝试将对象转换为类似的通用接口 此

type IFetchData<'a> = 
     abstract FetchData: string -> seq<'a>

我的示例用法在FSI中如下所示:

let sample = new Sample()
let box_sample = box(sample) //simulate reflection type that implements interface
let result = unbox<IFetchData<_>>(box_sample) //value restriction
let result2: IFetchData<_> = unbox<IFetchData<_>>(box_sample) //value restriction

我正在尝试实现类型成员FetchData的动态调用。 所以一旦我收到类型IFetchData&lt; _&gt;那么我想调用FetchData成员而不需要知道泛型类型究竟是什么。

我得到的错误是值限制错误。 任何帮助将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:2)

你不能只是坐在旁边的通用术语 - 但如果编译器可以推断出具体的类型你就可以了。或者,如错误消息所示,您可以转换为如下函数:

let result() = unbox<IFetchData<_>>(box_sample)

否则,您需要一个具体类型的结果,如

let result2 = unbox<IFetchData<char>>(box_sample)

虽然,在这里你需要事先了解你要拆箱的内容

或者,如果代码可以稍后根据您的用法推断出具体类型,那么您将没事。