Reflection F#Expr.TryGetReflectedDefinition与重载方法
我正在为FunScript项目(F#to Javascript编译器)编写一些扩展。如果你感兴趣,你可以找到来源 我试着模仿等待观察的扩展。但是,如果我使用重载方法,例如Reflection F#Expr.TryGetReflectedDefinition与重载方法,reflection,f#,funscript,Reflection,F#,Funscript,我正在为FunScript项目(F#to Javascript编译器)编写一些扩展。如果你感兴趣,你可以找到来源 我试着模仿等待观察的扩展。但是,如果我使用重载方法,例如AwaitObservable(w),AwaitObservable(w1,w2)…我在尝试将项目编译为Javascript时会遇到以下错误: An unhandled exception of type 'System.Reflection.AmbiguousMatchException' occurred in FSharp
AwaitObservable(w),AwaitObservable(w1,w2)…
我在尝试将项目编译为Javascript时会遇到以下错误:
An unhandled exception of type 'System.Reflection.AmbiguousMatchException' occurred in FSharp.Core.dll
Additional information: Ambiguous match found.
FunScript在项目中保留反映的定义的缓存字典,当它尝试使用Expr.TryGetReflectedDefinition
向缓存添加新定义时,会发生此错误。如果我使用不同的名称而不是重载(AwaitObservable2,AwaitObservable3…
),错误就会消失。这就是我现在使用的解决方法,但我想知道更多关于这个问题的信息,以及是否有可能修复它,以便扩展的用户可以正常使用重载方法
我可以想象,F#中的反射定义不支持重载方法,也不能仅仅通过参数的数量来区分方法(我无法检查这一点,因为我在fsharp GitHub源代码库中没有找到Expr.TryGetReflectedDefinition
)。然而,让我困惑的是,在寻找可观察对象时并没有发生错误,而是使用以下方法:
{System.IDisposable
System IObservable1-Subscribe(System.IObserver
1[FunScript.TypeScript.MouseEvent])System.Reflection.MethodBase
{System.Reflection.RuntimeMethodInfo}
因此,我的问题是:
Expr.TryGetReflectedDefinition
无法通过IObservable.Subscribe
而不是Async.AwaitObservable
Expr.TryGetReflectedDefinition
会抛出异常而不是返回无异常非常感谢您的帮助 好的,这似乎没有简单的答案,所以我将尝试回答我自己的问题。经过进一步调查
Async.AwaitObservable
以某种方式重载了存储的反射定义(这“不知何故”仍然无法解释),因此无法跟踪实现IObservable
的类型,这就是为什么他们不知道应该使用Subscribe
的哪个实现None
意味着没有找到反映的定义,但这里有一个不明确的匹配,因此情况不同CompiledName
属性修复了这个特殊情况下的问题,并为每个重载指定了不同的名称。现在一切正常:)