【问题标题】:Accessing dynamic property in F#在 F# 中访问动态属性
【发布时间】:2013-07-12 11:45:20
【问题描述】:

我试图访问 Nancy 中的动态属性。在 Nancy 中,如果在查询中传递参数,它将作为动态属性出现。我怎样才能访问它。

关于这个有很多讨论/问题,但在任何地方,首先是创建动态然后使用它。如何使用已创建的内容?

这里有两个代码sn-p

public class ParameterModule : NancyModule
    {
        public ParameterModule():base("/{about}")
        {
            this.Get["/"] = (parameters) => "Hello About" + parameters.about;
        }
    }

对于 F#

type ParameterModule() as this = 
    inherit NancyModule("/{about}")
    do this.Get.["/"] <- fun parameters -> "Hello" + parameters?("about") :> obj

我无法访问 about,因为对象没有该属性。

如果需要任何进一步的信息,请告诉我。

【问题讨论】:

    标签: c#-4.0 f# nancy c#-to-f# f#-3.0


    【解决方案1】:

    F# 动态运算符(?) 允许您在不使用引号的情况下传递字符串参数,实现与 C# 动态类似的语法,但您需要先针对具体用例定义它,编译器只提供语法。试试这个:

    let (?) (parameters:obj) param =
        (parameters :?> Nancy.DynamicDictionary).[param]
    
    type ParameterModule() as this = 
        inherit NancyModule("/{about}")
        do this.Get.["/"] <- fun parameters -> sprintf "Hello %O" parameters?about :> obj
    

    【讨论】:

    • 您好,谢谢您的回答。但是在实现这一点时,我遇到了这样的错误。从类型 'a 到 DynamicDictionary 的运行时强制或类型测试涉及基于此程序点之前的信息的不确定类型。某些类型不允许运行时类型测试。需要进一步的类型注释。
    • 对不起,必须将参数声明为obj,我已经用这个固定更新了答案
    • 完成...谢谢...我已选择正确答案,但我现在必须承认,我明白为什么使用 F# 的人更喜欢它...它不会使代码复杂,但即使比较外行。连我妈都能理解。
    【解决方案2】:

    也许这可以让你开始http://hubfs.net/topic/None/74053

    【讨论】:

    • 我试过了...但是很少有接口不允许我从 F# 中的 DynamicDictionary 继承。
    【解决方案3】:

    我已经通过类型转换为动态字典解决了问题。如果有更好的方法请告诉我。在此之前将保持问题开放......

    这是解决问题的代码

    type ParameterModule() as this = 
        inherit NancyModule("/{about}")
        do this.Get.["/"] <- fun parameters -> (parameters :?> Nancy.DynamicDictionary).["about"].ToString() :> obj
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      • 2013-07-12
      相关资源
      最近更新 更多