2012-10-02 2 views
4

나는 가능하다고 생각하지만 유형 확장을 통해 사용자 지정 서식을 허용하기 위해 이와 비슷한 작업을 수행 할 수 있습니까?StructuredFormatDisplayAttribute를 확장 메서드의 일부로 사용할 수 있습니까

[<StructuredFormatDisplayAttribute("Rate: {PrettyPrinter}")>] 
type Rate with 
    member x.PrettyPrinter = x.Title + string x.Value 

참고 : 그것은 고유 확장 (동일 조립)하지만 선택적인 확장 등으로 가능한 것으로 보인다.

아무에게도 좋은 대안이 없다면 이것이 기능 요청 일 수 있다고 생각하십니까?

답변

2

아니요, 불가능합니다. FSI에서는 fsi.AddPrinter을 사용하여 출력을 사용자 정의 할 수 있습니다.

fsi.AddPrinter (fun (x: Rate) -> x.Title + string x.Value) 

일반 문자열 서식 편집

, 당신은 %a 형식 지정자로 Printf를 사용할 수 있습니다. 몇 가지 추가 기능을 사용하면이 기능을보다 편리하게 사용할 수 있습니다. 당신이 말하는 것처럼

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>] 
module Rate = 
    let stringify (x: Rate) = x.Title + string x.Value 
    let print rate = printf "%s" (stringify rate) 

printf "Rate: %a" (fun _ -> Rate.print) rate 
let formattedString = sprintf "Rate: %a" (fun _ -> Rate.stringify) rate 
+0

프린터를 표준 콘솔에 추가 할 수 없습니다. – 7sharp9

+0

나는 당신이 무슨 뜻인지 모르겠다. 당신은 당신이 stdout하고 싶은 것을 보낼 수 있습니다. 해당 컨텍스트에는 _default_ 유형 _ 유형이 없습니다. – Daniel

+0

나는 std 프린터를 확장하는 것이 좋을 것이라고 말했습니다. Printf.AddPrinter (fun (x : Rate) -> x.Title + string x.Value) – 7sharp9

2

, 거기에 전용 속성으로 컴파일 회원 StructuredFormatDisplayAttribute 작품 (즉 표준 속성, 동일한 어셈블리 확장 있지만 확장 회원 포함). 커버에서,이 반사를 사용하여 액세스 (당신이 보는대로, 너무 개인이 될 수 있습니다) : 당신이 디버깅을 위해이 필요한 경우

let getProperty (obj: obj) name = 
    let ty = obj.GetType() 
    ty.InvokeMember(name, (BindingFlags.GetProperty ||| BindingFlags.Instance ||| 
     BindingFlags.Public ||| BindingFlags.NonPublic), 
     null, obj, [| |],CultureInfo.InvariantCulture) 

는 다음 DebuggerTypeProxy 속성 (MSDN documentation 참조)의 대안이 될 수 있습니다. 이렇게하면 원래 유형을 디버거에서 유형을 표시하는 데 사용되는 프록시 유형으로 바꿀 수 있습니다. (그러나 속성은 여전히 ​​확장이 아닌 실제 유형 정의에 배치되어야한다고 생각합니다.)

+0

이것은 일반적인 콘솔 출력을위한 디버깅을위한 것이 아닙니다. 실제로 예쁜 인쇄 코드를 확장과 모듈에 배치 할 수 있지만 속성을 실제 유형 정의에 배치해야합니다. – 7sharp9

관련 문제