2013-02-28 19 views
6

C#を使用してUnity3D用に開発しており、アサート機能を持つと便利だと決めました。 (Unity3Dでは、System.Diagnostics.Debug.Assertが存在するが、何もしません。)C#で関数の引数として使用される式を表す文字列を取得します

C++で主に働く開発者として、私は、プリプロセッサの文字列化演算子の仕方によってアサート表現を含むメッセージをアサートするために使用しています。つまり、フォームASSERT(x > 0, "x should not be zero.")のアサーションが失敗した場合、実行時メッセージに表示されるメッセージにはテキスト "x> 0"を含めることができます。私はC#で同じことをすることができるようにしたいと思います。

私はConditionalAttributeとDebuggerHiddenAttributeを認識していますが、両方を使用しています(後者はUnityにバンドルされたMonoDevelopのカスタムビルドでは無視されるようですが)。この問題の解決策を探しているうちに、私は、CallerFilePathAttribute、CallerLineNumberAttribute、およびCallerMemberNameAttributeの3つの属性、すなわち、System.Runtime.CompilerServices名前空間に出くわしました。 (私の実装では、代わりにSystem.Diagnostics.StackTracefNeedFileInfo == trueを使用しています)。と同じ機能を達成するのに役立つ反射マジック(おそらくそう思わない)または属性マジック(おそらく少しありそうです)があるのでしょうか?私はC++に慣れています。

答えて

6

あなたが式を渡した場合は、近くに取得することができx > 0したい:

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

はその後、好きなことを呼び出す必要があります:

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

はい、私は考えていた、まさに。あなたが作業コードを提供して以来、私は自分の答えを削除しました。 –

関連する問題