Типовые исключения - PullRequest
       11

Типовые исключения

2 голосов
/ 10 января 2012

Недавно я столкнулся с проблемой создания исключения с данным сообщением из общего метода.Например, следующий код работает должным образом:

public static void Throw<T>() where T : Exception, new()
{
    throw new T();
}

...

public static void Main()
{
    Throw<ArgumentOutOfRangeException>(); // Throws desired exception but with a generic message.
}

Однако я хотел бы написать:

public static void Throw<T>(string message) where T : Exception, new()
{
    T newException = new T();

    newException.Message = message; // Not allowed. 'Message' is read-only.

    throw newException;
}

...

public static void Main()
{
    Throw<ArgumentOutOfRangeException>("You must specify a non-negative integer."); // Throws desired exception.
}

Есть ли способ достичь этого без использования отражения?изменить значение свойства Message или динамически активировать экземпляр типа с требуемыми параметрами?

Ответы [ 2 ]

8 голосов
/ 10 января 2012

Вы можете использовать Activator.CreateInstance(typeof(T), "MyException description") для включения настраиваемого сообщения.

Нет способа создать экземпляр без использования отражения или использования активатора.

См

http://msdn.microsoft.com/de-de/library/wcxyzt4d(v=vs.80).aspx

3 голосов
/ 10 января 2012

Новое ограничение действительно только для конструкторов по умолчанию (без параметров), попробуйте это вместо:

public static void Throw<T>(string message) where T : Exception
{
    System.Reflection.ConstructorInfo constructor = typeof(T).GetConstructor(new Type[] { typeof(string) });
    T newException = (T)constructor.Invoke(new object[] { message });

    throw newException;
}

(обратите внимание, что в этом случае вам не нужно новое ограничение)

...