2012-02-28 2 views
0

형식 공급자를 통해 강력한 형식의 형식을 제공하는 방법을 얻지 못합니다. 표시되는 모든 예제는 입력과 독립적으로 결과와 동일한 유형을가집니다.강력하게 형식화 된 형식 공급자

MiniCsvTypeProvider는 double만을 제공합니다. RegexTypeProvider는 일치 항목 만 제공합니다.

유형 제공자에게 제공되는 매개 변수에 따라에 따라 다른 유형의 특성을 제공 할 수 있습니까?

if somevariable then 
     proptype = typeof<int> 
    else 
     proptype = typeof<string> 

    let staticProp = ProvidedProperty(propertyName = "property", 
             propertyType = propType, 
             GetterCode= (fun [arg] -> <@@ %%arg :?> propType @@>)) 
+0

또는 어쩌면 내가 공용 형식을 만들고 모든 항목에 대해 하나를 만들 필요가 있습니다. 그리 쉬운 일은 아닙니다. – nicolas

+0

런타임에서 '동적 캐스트' – nicolas

+0

을 수행해야한다고 생각합니다. (이 모든 sh * t는 준비된 런타임과 함께 사라집니다.) – nicolas

답변

2

예, 입력에 따라 다른 유형을 제공하는 것은 쉽습니다. 아주 간단한 예를 들어, 당신은 같은 것을 할 수있는 :

let propType, propValue = 
    if somevariable then 
     typeof<int>, <@@ 1 @@> 
    else 
     typeof<string>, <@@ "test" @@> 

let prop = ProvidedProperty("property", propType, GetterCode = fun [_] -> propValue) 

당신이 제안하고있는 라인을 따라이 확장을, 당신은 조건에 전체 게터를 정의 할 수 있습니다 :

그러나
let propType, propGetter = 
    if somevariable then 
     typeof<int>, fun [arg] -> <@@ %%arg : int @@> 
    else 
     typeof<string>, fun [arg] -> <@@ %%arg : string @@> 

let prop = ProvidedProperty("property", propType, GetterCode = fun [_] -> propValue) 

, 메모를 그 속성을 호출하는 표현이 각각 int 또는 string인지 확인해야합니다. 선택한 이름 (staticProp)과 달리 수신자 (arg)를 getter로 전달하고 고정적으로 ProvidedProperty으로 표시하지 않았으므로 정적 속성이 아닙니다.

+0

고맙습니다. 나는 이것을 실제로 시험 할 필요가있다. – nicolas

관련 문제