获取表示在C#中用作函数参数的表达式的字符串

我正在使用C#为Unity3D开发,并认为拥有一个断言函数会很有用. (在Unity3D中,System.Diagnostics.Debug.Assert存在,但什么都不做.)

作为主要在C中工作的开发人员,我习惯通过预处理器字符串化运算符来断言包含断言表达式的消息.也就是说,如果形式ASSERT(x> 0,“x不应该为零”)的断言失败,则在运行时消息处显示的消息可以包括文本“x> 0”.我希望能够在C#中做同样的事情.

我知道ConditionalAttribute和DebuggerHiddenAttribute,并且正在使用它们(虽然后者似乎被与Unity捆绑的MonoDevelop的自定义构建忽略).在搜索此问题的解决方案时,我在System.Runtime.CompilerServices命名空间中遇到了三个与我正在尝试执行的操作相关的属性:CallerFilePathAttribute,CallerLineNumberAttribute和CallerMemberNameAttribute. (在我的实现中,我使用System.Diagnostics.StackTrace而fNeedFileInfo == true.)

我想知道是否有任何反射魔法(似乎不太可能)或属性魔法(似乎更有可能)可以帮助我实现我在C中习惯的相同功能.

解决方法

如果你传递一个表达式,你可以接近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");

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...