2013-07-14 4 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 
1

어쩌면 이것이 당신이 시작 얻을 수있는 문제를 해결하는 코드입니다 ... 그때까지 질문을 열어 계속됩니다 http://hubfs.net/topic/None/74053

+0

링크에 감사드립니다 ... 멋지 네요. 반복 코드에 대한 내 작업을 저장하십시오 ... – kunjee

+0

시도해 보았습니다. 그러나 F #의 DynamicDictionary에서 상속하는 인터페이스가 거의 없습니다. – kunjee