2013-02-28 45 views
6

Tôi đang phát triển cho Unity3D bằng C# và quyết định sẽ hữu ích khi có hàm xác nhận. (Trong Unity3D, System.Diagnostics.Debug.Asserttồn tại, nhưng không có gì.)Nhận chuỗi đại diện cho biểu thức được sử dụng làm đối số hàm trong C#

Là một nhà phát triển làm việc chủ yếu trong C++, tôi đang sử dụng để khẳng định thông điệp có chứa biểu thức khẳng định bằng cách khai thác Preprocessor stringizing. Tức là, với xác nhận không thành công của biểu mẫu ASSERT(x > 0, "x should not be zero."), thông báo được hiển thị trong thông báo thời gian chạy có thể bao gồm văn bản "x> 0". Tôi muốn có thể làm tương tự trong C#.

Tôi biết ConditionalAttribute và DebuggerHiddenAttribute và đang sử dụng cả hai (mặc dù sau này dường như bị bỏ qua bởi bản dựng tùy chỉnh của MonoDevelop đi kèm với Unity). Trong khi tìm kiếm giải pháp cho vấn đề này, tôi đã xem ba thuộc tính trong không gian tên System.Runtime.CompilerServices có vẻ liên quan đến những gì tôi đang cố gắng thực hiện: CallerFilePathAttribute, CallerLineNumberAttribute và CallerMemberNameAttribute. (Trong thực hiện của tôi, tôi sử dụng System.Diagnostics.StackTrace với fNeedFileInfo == true để thay thế.)

Tôi tự hỏi liệu có lẽ ma thuật phản chiếu (dường như không chắc) hoặc ma thuật thuộc tính (có vẻ hơi có khả năng hơn) có thể giúp tôi đạt được chức năng giống như Tôi đã từng sử dụng C++.

Trả lời

6

Nếu bạn vượt qua một biểu thức, bạn có thể có được gần với x > 0 bạn muốn:

[Conditional("DEBUG")] 
public static void Assert(Expression<Func<bool>> assertion, string message, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) 
{ 
    bool condition = assertion.Compile()(); 
    if (!condition) 
    { 
     string errorMssage = string.Format("Failed assertion in {0} in file {1} line {2}: {3}", memberName, sourceFilePath, sourceLineNumber, assertion.Body.ToString()); 
     throw new AssertionException(message); 
    } 
} 

Sau đó bạn cần phải gọi nó thích:

Assert(() => x > 0, "x should be greater than 0"); 
+0

Vâng, chính xác những gì tôi đã suy nghĩ. Vì bạn đã cung cấp mã làm việc, tôi đã xóa câu trả lời của mình. –

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