15

属性と C# の例はここに記載されていますが、FSharp では可能ではないようです。

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#で上記を行うことは可能ですか?もしそうなら、表記法は何ですか?

4

2 に答える 2

14

コンパイラのソース コードを簡単に検索すると、名前CallerMemberNameがコードのどこにも表示されないことがわかります。そのため、この機能はサポートされていないと思います。(パラメーターを属性でマークすることは確かにできますが、これらの属性は特別です。これらの属性は、実行時に検出されて何らかの方法で使用される代わりに、コンパイラーに指示します。)

2016 年 7 月の更新: 6 月下旬の時点で、F# は CallerLineNumberandCallerFilePathをサポートするようになりましたCallerMemberNameが、まだサポートされていません。残念ながら、特に実装が難しいようです。

関連して、F# には現在のソース ファイル名と行番号を取得できる特別な識別子がいくつかあるため、and を使用して同様の情報を取得できる可能性があります__SOURCE_DIRECTORY__ (__LINE__
ただし、C# のように呼び出し元から取得することはできません)。

于 2013-01-02T11:48:14.867 に答える
5

inlineこれは、この情報を取得するために悪用する簡単で汚いハックです。

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

それは実際には多かれ少なかれ機能します:

ここに画像の説明を入力 ここに画像の説明を入力

于 2015-07-15T22:02:53.470 に答える