fp | FP‎ > ‎fp | F#‎ > ‎

f# | type provider

Type Provider - 通过 给一个自定义基类共享信息

我有一个坏习惯,对我来说,忘记它不是很容易。昨天晚上,这个小怪物又来困扰了我。可能我不能解决之前的问题,相反我被引诱到一片新领土。昨天晚上,这个怪物提醒了我单元测试 type provider, 使我想到怎样在不同的type provider方法间共享信息。

目前的type provider的方法调用是独立的, 几乎没有如何维护一个内部状态的例子。正则表达式type provider是一个例子。一旦你有了匹配的组,那个组就是一个自给的结构而不需要和另外匹配的组交互。我感兴趣的是怎样使信息在type provider的方法调用中流动/共享。例如,我想Method2去更新在Method1中发送的信息。b应该是"aa"

type T = MyTypeProvider

lett = T()

t.Method1("aa")

letb = t.Method2()

我想使用的方法是使用type provider里面的基类。目前的实例type providers总是取obj作为基类,然而我想使用我的类来存储我自己的东西。你能从这里下载代码。

用来保存在Method1里面传递的信息的基类是X。请保证type 和member一定是公有的。

type BaseType2() =

        memberval X = ""withget, set

生成的代码取第一个元素%%arg.[0]为"this"指针,然后转换成 BaseType2.你不必先转换成obj然后再转换成BaseType2。当你使用typeprovider的时候,那个转换将生成一个错误。

InvokeCode = fun args -> <@@(%%args.[0]:BaseType2).X <- (%%args.[1]) @@>)

重要的是构造函数,请重新运行一个BaseType2()。 否则, 一个运行时错误提醒空的引用。 我猜那就是你需要让它工作的所有事情。

测试程序是:

#r@".\bin\Debug\ShareInfoSampleTypeProvider.dll"

type T = Samples.ShareInfo.TPTest.TPTestType

let t = T()

t.F1("aa")

let a = t.F2()

printfn "the parameter in F1 is %A" a

结果是:

the parameter in F1 is"aa"

这个技术用一个更自动的方式打开了扩展已存在类型的门。你可以使用扩展方法来扩展类型,但是你必须敲每个字符。现在,你可以写你的type provider来扩展你的类型。你的程序 将生成方法和属性。

给我一些时间来想一个好的实例, 现在,该赶紧睡觉了.. :)

 

原文链接:http://apollo13cn.blogspot.com/2012/05/type-provider-share-information-by.html

http://msdn.microsoft.com/zh-tw/library/hh361033.aspx#BKMK_SetUpTypeProv