2013-02-28 12 views
6

Pracuję dla Unity3D przy użyciu C# i zdecydowałem, że byłoby użyteczne mieć funkcję assert. (W Unity3D, System.Diagnostics.Debug.Assertistnieje, ale nic nie robi.)Pobierz ciąg reprezentujący wyrażenie używane jako argument funkcji w C#

Jako deweloper, który działa głównie w C++, jestem przyzwyczajony do dochodzić wiadomości zawierające wyrażenie rzekoma drodze operatora preprocesor stringizing. Oznacza to, że w przypadku nieudanego potwierdzenia postaci ASSERT(x > 0, "x should not be zero."), komunikat wyświetlany w komunikacie uruchomieniowym może zawierać tekst "x> 0". Chciałbym móc zrobić to samo w języku C#.

Mam świadomość atrybutu warunkowegoAttribute i DebuggerHiddenAttribute i używam obu (chociaż ten ostatni wydaje się być ignorowany przez niestandardową kompilację MonoDevelop dołączoną do Unity). Szukając rozwiązania tego problemu, natrafiłem na trzy atrybuty w przestrzeni nazw System.Runtime.CompilerServices, które wydają się być związane z tym, co próbuję zrobić: CallerFilePathAttribute, CallerLineNumberAttribute i CallerMemberNameAttribute. (W mojej realizacji, używam System.Diagnostics.StackTrace z fNeedFileInfo == true zamiast.)

Zastanawiam się, czy istnieje jakikolwiek odbicie może magia (mało prawdopodobne) lub magii atrybutu (wydaje się nieco bardziej prawdopodobne), że może pomóc mi osiągnąć taką samą funkcjonalność jak Jestem przyzwyczajony do C++.

Odpowiedz

6

Jeśli zdasz wyrażenie można zbliżyć się do x > 0 chcesz:

[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); 
    } 
} 

Następnie trzeba nazwać to lubią:

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

Tak, dokładnie to, co myślał. Ponieważ podałeś działający kod, usunąłem odpowiedź. –