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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值