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命名空间中遇到了三个似乎与我正在尝试执行的操作相关的属性:CallerFilePathAttribute、CallerLineNumberAttribute 和 CallerMemberNameAttribute。(在我的实现中,我使用System.Diagnostics.StackTracewithfNeedFileInfo == 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 回答