F#类型提供者为可选字段设必填参数出现「指定方法不受支持」错误
解决方案
你遇到的报错是F#类型提供者设计时上下文的常见限制:Expr.NewUnionCase对通过运行时反射获取的泛型联合类型(比如这里构造的Option<T>)支持不完善,容易触发「指定的方法不受支持」错误。
你可以把构造Some联合实例的逻辑换成调用Option<T>的静态Some方法,兼容性更好,修改后的代码片段如下:
match args with | this :: [arg] -> // 替换原有NewUnionCase逻辑 let someMethod = typedefof<Option<_>>.GetMethod("Some", System.Reflection.BindingFlags.Public ||| System.Reflection.BindingFlags.Static) let genericSomeMethod = someMethod.MakeGenericMethod(type') let arg' = Expr.Call(genericSomeMethod, [arg]) let setValue = Expr.FieldSet(this, field, arg') let enumField = Expr.FieldSet(this, enumField, Expr.FieldGet(enum.GetField(field.Name))) Expr.Sequential(enumField, setValue) | _ -> failwith "wrong ctor parameters"
这段逻辑的作用和你原来的NewUnionCase完全等价:将输入的原始类型参数包装为对应Option<T>的Some实例,赋值给类的option类型字段,即可实现你期望的Example(1)直接实例化的效果。
内容的提问来源于stack exchange,提问作者bdkoepke
相关产品推荐
相关产品推荐

