class Command { public virtual void Execute() { } }
class InvalidOperationException<T> : InvalidOperationException where T : Command { public InvalidOperationException(string message) : base(message) { } // some specific information about // the command type T that threw this exception }
static class CommandExtensions { public static void ThrowInvalidOperationException<TCommand>( this TCommand command, string message) where TCommand : Command { throw new InvalidOperationException<TCommand>(message); } }
class CopyCommand : Command { public override void Execute() { // after something went wrong: this.ThrowInvalidOperationException("Something went wrong"); } }
class CutCommand : Command { public override void Execute() { // after something went wrong: this.ThrowInvalidOperationException("Something else went wrong"); } }