2013-01-02 27 views
12

Thuộc tính và C# ví dụ được ghi chú ở đây nhưng có vẻ như không thể cho FSharp.Có thể sử dụng CallerMemberNameAttribute trong 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); 
} 

Sample Output:

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 

Có thể làm các việc trên trong F # và nếu các ký hiệu là vì vậy những gì?

+0

gì có bạn đã thử? Hầu như tất cả mọi thứ có thể được thực hiện trong C# có thể được thực hiện trong f #. –

+0

Nếu bạn có một gợi ý về những gì để thử sau đó xin vui lòng cho nó. – bradgonesurfing

+0

Cú pháp attributte cũng là '[] arg'. Mọi thứ sẽ phức tạp bởi các loại tùy chọn - nhưng bạn có thể nhận được một thông báo lỗi phong nha bằng cách thử điều này. –

Trả lời

9

Tìm kiếm nhanh qua compiler source code cho biết tên CallerMemberName không xuất hiện ở bất kỳ đâu trong mã, vì vậy tôi nghĩ tính năng này không được hỗ trợ. (Bạn chắc chắn có thể đánh dấu một tham số với các thuộc tính, nhưng những thuộc tính này là đặc biệt - họ chỉ thị cho trình biên dịch thay vì được phát hiện và được sử dụng trong một số cách khi chạy.)

Cập nhật tháng 7 2016: Tính đến cuối tháng Sáu, F# now supportsCallerLineNumberCallerFilePath, nhưng CallerMemberName vẫn không có. Có vẻ như một người đặc biệt khó thực hiện hơn, thật không may.

Trên một lưu ý liên quan, F # có few special identifiers cho phép bạn có được tên file nguồn và dòng số lượng hiện tại, vì vậy bạn có thể có thể để có được thông tin tương tự với __SOURCE_DIRECTORY____LINE__
(nhưng không phải từ người gọi như trong C#).

4

Dưới đây là một cách nhanh chóng 'n' bẩn hack, mà lạm dụng inline để có được thông tin này:

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

Nó thực sự không làm việc, nhiều hơn hoặc ít hơn:

enter image description here enter image description here

Các vấn đề liên quan