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