2013-01-02 28 views
12

Atrybuty i przykłady C# są tutaj zaznaczone, ale nie jest to możliwe dla FSharp.Czy jest możliwe użycie CallerMemberNameAttribute w f #

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

// using System.Runtime.CompilerServices 
// using System.Diagnostics; 

public void DoProcessing() 
{ 
    TraceMessage("Something happened."); 
} 

public void TraceMessage(string message, 
     [CallerMemberName] string memberName = "", 
     [CallerFilePath] string sourceFilePath = "", 
     [CallerLineNumber] int sourceLineNumber = 0) 
{ 
    Trace.WriteLine("message: " + message); 
    Trace.WriteLine("member name: " + memberName); 
    Trace.WriteLine("source file path: " + sourceFilePath); 
    Trace.WriteLine("source line number: " + sourceLineNumber); 
} 

Próbka wyjściowa:

message: Something happened. 
member name: DoProcessing 
source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs 
source line number: 31 

Czy to możliwe, aby zrobić powyżej w F #, a jeśli tak, to jaki jest zapis?

+0

Cóżeś wypróbowany? Prawie wszystko, co można zrobić w języku C#, można zrobić w języku f #. –

+0

Jeśli masz sugestie na temat tego, co należy wypróbować, podaj je. – bradgonesurfing

+0

Cóżą składnia attributte to '[] arg'. Rzeczy będą komplikowane przez typy opcji - ale możesz spróbować uzyskać przyzwoity komunikat o błędzie. –

Odpowiedz

9

Szybkie wyszukiwanie poprzez pokazuje, że nazwa CallerMemberName nie pojawia się nigdzie w kodzie, więc myślę, że ta funkcja nie jest obsługiwana. (Można oczywiście zaznaczyć parametr z atrybutem, ale cechy te są wyjątkowe - instruują kompilator zamiast odkryte i wykorzystane w jakiś sposób w czasie wykonywania.)

Aktualizacja lipiec 2016: Począwszy od końca czerwca, F# now supportsCallerLineNumber i CallerFilePath, ale CallerMemberName jest nadal nieobecny. Wygląda na to, że niestety jest trudniej wprowadzić w życie.

Na powiązana uwaga F # ma few special identifiers które pozwalają uzyskać bieżącą nazwę pliku źródłowego i numer wiersza, więc może być w stanie uzyskać podobne informacje z __SOURCE_DIRECTORY__ i __LINE__
(ale nie od rozmówcy, jak w C#).

4

Oto krótki 'n' dirty hack, który nadużywa inline dostać tę informację:

module Tracing = 
    open System 
    open System.Text.RegularExpressions 

    let (|TraceInfo|_|) (s:string) = 
     let m = Regex.Match(s, "at (?<mem>.+?) in (?<file>.+?\.[a-zA-Z]+):line (?<line>\d+)") 
     if m.Success then 
      Some(m.Groups.["mem"].Value, m.Groups.["file"].Value, int m.Groups.["line"].Value) 
     else None 

    let inline trace s = 
     printfn "%s" s 
     match Environment.StackTrace with 
     | TraceInfo(m, f, l) -> 
      printfn " Member: %s" m 
      printfn " File : %s" f 
      printfn " Line : %d" l 
     | _ ->() 

To faktycznie działa, bardziej lub mniej:

enter image description here enter image description here

Powiązane problemy