6

C# を使用して Unity3D の開発を行っていますが、アサート機能があると便利だと判断しました。(Unity3D では、System.Diagnostics.Debug.Assert 存在しますが、何もしません。)

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

私は ConditionalAttribute と DebuggerHiddenAttribute を認識しており、両方を使用しています (ただし、後者は Unity にバンドルされている MonoDevelop のカスタム ビルドでは無視されているようです)。この問題の解決策を探しているときに、私System.Runtime.CompilerServicesが行おうとしていることに関連していると思われる名前空間の 3 つの属性に出くわしました: CallerFilePathAttribute、CallerLineNumberAttribute、および CallerMemberNameAttribute。(私の実装では、代わりにSystem.Diagnostics.StackTracewithを使用しfNeedFileInfo == trueます。)

C ++で慣れているのと同じ機能を実現するのに役立つリフレクションマジック(可能性は低いようです)または属性マジック(可能性が少し高いようです)があるかどうか疑問に思っています。

4

1 に答える 1

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");
于 2013-02-28T23:13:17.237 に答える