2013-01-02 18 views
12

属性とC#の例はここに記載されていますが、FSharpでは使用できないように見えます。CallerMemberNameAttributeを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); 
} 

サンプル出力:

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 

は、それがF#で上記の操作を行うと表記がそう何である場合にすることは可能ですか?

+0

あなたを持っている何試した? C#でできることはほとんどすべてf#で行えます。 –

+0

何を試してみるか提案がある場合は、それを与えてください。 – bradgonesurfing

+0

属性の構文は '[] arg'です。オプションの種類によっては状況が複雑になりますが、これを試すことでまともなエラーメッセージが表示されることがあります。 –

答えて

9

compiler source codeでクイック検索すると、コードのどこにでもCallerMemberNameという名前が表示されないので、この機能はサポートされていないと考えられます。 (あなたは属性でパラメータをマーク確かにすることができますが、これらの属性は特別です - 彼らが発見し、実行時にいくつかの方法で使用されているのではなく、コンパイラに指示します。)

アップデート2016年7月:、F# now supports下旬6月現在CallerLineNumberおよびCallerFilePathであるが、CallerMemberNameは依然として存在しない。残念ながら、特に実装するのが難しいようです。あなたは__SOURCE_DIRECTORY____LINE__
と同様の情報を取得することができるかもしれませんので、関連ノートで

、F#が、あなたは現在のソースファイル名と行番号を取得してみましょうfew special identifiersを持っている(ただし、発信者からのC#のように、 )。

4

ことはここでは、この情報を取得するためにどの虐待inline、迅速な 'n' の汚いハックです:

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 
     | _ ->() 

それが実際に作業を行い、多かれ少なかれ:

enter image description here enter image description here

関連する問題