gpt4 book ai didi

f# - 如何为所提供的方法提供带有静态参数的返回类型

转载 作者:行者123 更新时间:2023-12-02 20:09:30 28 4
gpt4 key购买 nike

F# 4.0 引入了向所提供的方法提供静态参数的功能(请参阅 http://blogs.msdn.com/b/fsharpteam/archive/2014/11/12/announcing-a-preview-of-f-4-0-and-the-visual-f-tools-in-vs-2015.aspx)

我希望我提供的方法的返回类型取决于用户提供的静态参数。

我需要在 DefineStaticParameters 回调之外定义返回类型,以便可以将其传递给 this.AddNamespace 但不幸的是,这意味着 AddMethod 被多次调用我最终得到了一堆不需要的重载。如果我将 returnType 的创建移到 DefineStaticParameters 回调中,那么我无法将其传递给 AddNamespace 并且类型提供程序不再起作用。

如何解决这个难题?

示例代码:

[<TypeProvider>]
type MyTypeProvider (config : TypeProviderConfig) as this =
inherit TypeProviderForNamespaces ()

let ns = "Acme"
let asm = Assembly.GetExecutingAssembly()

let t = ProvidedTypeDefinition(asm, ns, "MyStaticClass", Some typeof<obj>, IsErased = true)
let returnType = ProviderImplementation.ProvidedTypes.ProvidedTypeDefinition(asm, ns, "MyReturnType", Some typeof<obj>, IsErased = true, HideObjectMethods = true)

let myStaticMethod =
let m = ProvidedMethod("SomeStaticMethod", [], typeof<obj>, IsStaticMethod = true)

m.DefineStaticParameters(staticParams, fun nm args ->

let providedMethod = ... // Generate a method for the return type depending on the args
returnType.AddMember(providedMethod) // PROBLEM: This gets called multiple times and adds unwanted overloads to my returnType

let m2 =
let myParam = ProvidedParameter("foo", typeof<int>)
ProvidedMethod(nm, [myParam], returnType, IsStaticMethod = true)

m2.InvokeCode <- fun args3 ->
<@@
// invoke code goes here
@@>

t.AddMember(m2)
m2
)
m

do
t.AddMember(myStaticMethod)
this.AddNamespace(ns, [t;returnType])

[<assembly:TypeProviderAssembly>]
do ()

最佳答案

如果您确实需要在每次使用不同的静态参数时向命名空间添加新类型,那么我认为唯一的方法是将您需要的信息存储在缓存中并触发 Invalidate 事件,当您需要向命名空间添加新类型时,然后从缓存中重新填充所有类型。

关于f# - 如何为所提供的方法提供带有静态参数的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35068057/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com