2013-07-14 105 views
4

我試圖訪問南希的動態屬性。在南希如果在查詢中傳遞參數它來動態屬性。我怎樣才能訪問它。訪問F中的動態屬性#

關於此問題有許多討論/問題,但每個地方,首先是創建動態,然後消耗它。我如何消費已經創造的東西?

這裏有兩個代碼片段

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 

我不是爲研究對象沒有這樣的屬性訪問。

請讓我知道是否需要進一步的信息。

回答

9

的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 
+0

嘿,謝謝你的回答。但是在實現這個時,我得到這樣的錯誤 從類型'a到DynamicDictionary的此運行時強制或類型測試涉及基於此程序點之前的信息的不確定類型。某些類型不允許運行時類型測試。需要進一步的類型註釋。 – kunjee

+0

對不起,不得不聲明參數爲'obj',我已經更新了該固定的答案 –

+0

完成...謝謝...我已經選擇了正確的答案,但我不得不承認現在我得到了爲什麼使用F#更喜歡它......它不會讓代碼變得複雜,但更多的是外行人。甚至我的媽媽也能理解它。 – kunjee

1

我已經通過類型轉換爲dynamicdictionary來解決問題。如果有更好的方法,請讓我知道。將保持開放的問題,到那時......

下面是解決這一問題的代碼

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