2013-02-28 10 views
6

Ich bin für Unity3D mit C# entwickeln und entschieden, dass es nützlich wäre, eine Assert-Funktion haben. (In Unity3D, System.Diagnostics.Debug.Assertexistiert, tut aber nichts.)Get Zeichenfolge, die den Ausdruck als Funktionsargument in C#

Als Entwickler, die in erster Linie in C++ funktioniert, ich verwende, um Nachrichten zu behaupten, dass der geltend gemachten Ausdruck durch den Präprozessor Zeichenfolge Operator enthält. Das heißt, bei einer fehlgeschlagenen Aktivierung des Formulars ASSERT(x > 0, "x should not be zero.") kann die zur Laufzeit angezeigte Nachricht den Text "x> 0" enthalten. Ich würde gerne dasselbe in C# machen können.

Ich kenne ConditionalAttribute und DebuggerHiddenAttribute und verwende beide (obwohl Letzteres von dem benutzerdefinierten Build von MonoDevelop ignoriert wird, das mit Unity gebündelt wird). Bei der Suche nach einer Lösung für dieses Problem stieß ich auf drei Attribute im Namespace System.Runtime.CompilerServices, die scheinen, was ich versuche zu tun: CallerFilePathAttribute, CallerLineNumberAttribute und CallerMemberNameAttribute. (In meiner Implementierung verwende ich System.Diagnostics.StackTrace mit fNeedFileInfo == true statt.)

Ich frage mich, ob es vielleicht irgendeine Reflexion Magie (scheint unwahrscheinlich) oder Magie-Attribut (scheint etwas häufiger), die mir die gleiche Funktionalität erreichen helfen kann Ich bin in C++ gewohnt.

Antwort

6

Wenn Sie einen Ausdruck passieren können Sie ganz nah an der x > 0 Sie wollen:

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

Anschließend müssen Sie es nennen mag:

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

Ja, genau das, was ich dachte. Da Sie Arbeitscode zur Verfügung gestellt haben, löschte ich meine Antwort. –