我正在尝试编写一个帮助程序方法,该方法将记录一条消息并使用同一条消息引发指定类型的异常。我有以下内容:
private void LogAndThrow<TException>(string message, params object[] args) where TException : Exception, new()
{
message = string.Format(message, args);
Logger.Error(message);
throw new TException(message);
}
在添加
new()
约束之前,编译器提示说,没有它,我无法实例化TException
。现在,我得到的错误消息是“在创建类型参数'TException'的实例时无法提供参数”。我尝试使用无参数构造函数创建实例,然后设置Message
属性,但它是只读的。这是语言的限制,还是我不知道的解决方案?也许我可以使用反射,但是对于这样一个简单的任务来说,这太过分了。 (而且很丑陋,但这是个人观点的问题。)
最佳答案
您可以使用 Activator.CreateInstance()
(允许您传递参数)来创建TException
的实例。然后,您可以抛出创建的TException
。
例如:
private void LogAndThrow<TException>(string message, params object[] args) where TException : Exception, new()
{
message = string.Format(message, args);
Logger.Error(message);
TException exception = (TException)Activator.CreateInstance(typeof(TException), message);
throw exception;
}