Дизайн по контракту и общие исключения - PullRequest
1 голос
/ 03 апреля 2012

Я нахожусь на ранней стадии реализации очень простого статического вспомогательного класса «проектирование по контракту», подобного Assert в NUnit. В идеале я хочу передать выражение, проверить, верно ли оно, а если нет, выдать конкретное исключение с любыми параметрами или сообщениями об ошибках. В идеальном мире Я бы делал что-то вроде этого:

// ideal
Assert.True<ArgumentNullException>(user != null, "User", "User cannot be null");

// not so ideal
Assert.True(user != null, new ArgumentNullException("User", "User cannot be null");

Теперь моя проблема в том, что ограничение на Assert.True<T> будет Exception, new(), чтобы я мог создать новое исключение желаемого типа. Ключевая проблема, с которой я сталкиваюсь, заключается в том, что, во-первых, универсальные конструкторы не допускают параметры, а во-вторых, большинство свойств конструкторов Exception имеют только GET.

Любая помощь очень ценится, спасибо.

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

Я уверен, что вы уже знаете о поддержке контрактов Microsoft, но в случае, если вы не (и, следовательно, неосознанно изобретаете колесо), вы можете узнать о них здесь:

http://research.microsoft.com/en-us/projects/contracts/

1 голос
/ 03 апреля 2012

Примерно так:

Assert.True(user != null, () => new ArgumentNullException("User", "User cannot be null");

Делегируя создание экземпляра исключения анонимному методу, вы создаете исключение только тогда, когда это необходимо.Это также позволяет обойти вашу проблему с созданием исключения в вашем Assert классе.

Assert.True может выглядеть примерно так:

public static True(bool condition, Action<Exception> exception)
{
    if(!condition) throw exception();
}
0 голосов
/ 03 апреля 2012

Спасибо за ваши ответы;Я нашел небольшую работу в форме System.Activator.CreateInstance, которая обсуждалась в очень похожем посте, найденном здесь: Исключения приведения в C # :

throw (T) System.Activator.CreateInstance(typeof(T), message, innerException);
...