65.9K
CodeProject is changing. Read more.
Home

Assert with Assertion!

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (9 votes)

Dec 14, 2020

CPOL
viewsIcon

9194

Instantiate the exception that you want in an assertion

Introduction

The typical assertion looks like this:

if (someConditionIsNotMet)
{
   throw new SomeSpecificException("message");
}

However, I personally do not like littering my code with if statements for assertions. What I prefer is:

Assertion.That(someConditionIsMet, "message");

but I lose the ability to specify the specific Exception that I want thrown.

So what I want is something like:

Assertion.That<MyException>(someConditionIsMet, "message");

but the base class Exception, while it has a parameterless constructor, won't let me assign the message after the exception is created. Note that Message is a read only property in the Exception class:

public virtual string Message { get; }

Activator.CreateInstance to the Rescue

My solution is to use Activator.CreateInstance and pass in the specific exception type I want instantiated, along with the exception message.

public static class Assert
{
  public static void That<T>(bool condition, string msg) where T : Exception, new()
  {
    if (!condition)
    {
      var ex = Activator.CreateInstance(typeof(T), new object[] { msg }) as T;
      throw ex;
    }
  }
}

That's it - the where verifies at compile time that the generic is of type Exception and is an instance type.

If you know of a better way of doing this, let me know!

History

  • 14th December, 2020: Initial version