2013-02-28 2 views
6

Я разрабатываю для Unity3D с помощью C# и решил, что было бы полезно иметь функцию assert. (В Unity3D, System.Diagnostics.Debug.Assertсуществует, но ничего не делает.)Получить строку, представляющую выражение, используемое как аргумент функции в C#

Как разработчик, который работает в основном в C++, я привык утверждать сообщения, которые содержат заявленную выражение посредством оператора препроцессора stringizing. То есть, при неудачном утверждении формы ASSERT(x > 0, "x should not be zero."), сообщение, отображаемое во время выполнения сообщения, может содержать текст «x> 0». Я хотел бы иметь возможность сделать то же самое в C#.

Я знаю об условном атрибуте и отладчикеHiddenAttribute и использую оба (хотя последнее, похоже, игнорируется пользовательской сборкой MonoDevelop в комплекте с Unity). При поиске решения этой проблемы я столкнулся с тремя атрибутами в пространстве имен System.Runtime.CompilerServices, которые, похоже, связаны с тем, что я пытаюсь сделать: CallerFilePathAttribute, CallerLineNumberAttribute и CallerMemberNameAttribute. (В моей реализации, я использую System.Diagnostics.StackTrace с fNeedFileInfo == 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

Да, именно то, что я имел в виду. Поскольку вы предоставили рабочий код, я удалил свой ответ. –

Смежные вопросы