2013-02-28 8 views
6

Sto sviluppando per Unity3D utilizzando C# e ho deciso che sarebbe utile avere una funzione di asserzione. (In Unity3D, System.Diagnostics.Debug.Assertesiste, ma non fa nulla.)Ottieni stringa che rappresenta l'espressione utilizzata come argomento di funzione in C#

Come sviluppatore che lavora principalmente in C++, io sono abituato ad affermare i messaggi che contengono l'espressione rivendicato dell'operatore preprocessore stringizing. Cioè, data la mancata affermazione del modulo ASSERT(x > 0, "x should not be zero."), il messaggio visualizzato al messaggio di runtime può includere il testo "x> 0". Mi piacerebbe essere in grado di fare lo stesso in C#.

Sono a conoscenza di ConditionalAttribute e DebuggerHiddenAttribute e sto utilizzando entrambi (anche se quest'ultimo sembra essere ignorato dalla build personalizzata di MonoDevelop in bundle con Unity). Durante la ricerca di una soluzione a questo problema, ho trovato tre attributi nello spazio dei nomi System.Runtime.CompilerServices che sembrano correlati a ciò che sto cercando di fare: CallerFilePathAttribute, CallerLineNumberAttribute e CallerMemberNameAttribute. (Nella mia implementazione, io uso System.Diagnostics.StackTrace con fNeedFileInfo == true invece.)

Mi chiedo se non v'è forse alcuna magia di riflessione (sembra improbabile) o un attributo magico (sembra un po 'più probabile) che può aiutarmi a raggiungere la stessa funzionalità Sono abituato a C++.

risposta

6

Se si passa l'espressione si può arrivare vicino al x > 0 si desidera:

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

È quindi necessario chiamare come:

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

Sì, esattamente quello che stavo pensando. Dato che hai fornito il codice di lavoro, ho cancellato la mia risposta. –

Problemi correlati