【发布时间】:2008-09-03 10:08:11
【问题描述】:
好吧,我知道我用这个完全会看起来像个白痴,但我的大脑今天早上只是没有开始运转。
我想要一个方法,我可以说“如果它变坏了,就返回这种类型的异常”,对吧?
例如,类似(这不起作用):
static ExType TestException<ExType>(string message) where ExType:Exception
{
Exception ex1 = new Exception();
ExType ex = new Exception(message);
return ex;
}
现在让我感到困惑的是,由于 where 子句,我们知道泛型类型将属于异常类型。但是,代码失败了,因为我们不能将 Exception 隐式转换为 ExType。我们也不能显式转换,比如:
static ExType TestException<ExType>(string message) where ExType:Exception
{
Exception ex1 = new Exception();
ExType ex = (ExType)(new Exception(message));
return ex;
}
因为那也失败了..所以这种事情可能吗?我有一种强烈的感觉,它会很简单,但我和老头子度过了艰难的一天,所以切我有些懈怠:P
更新
感谢大家的回复,看来不是我是一个完全的白痴! ;)
好的,所以Vegard 和Sam 让我可以实例化正确的类型,但显然卡住了,因为 message 参数在实例化后是只读的。
Matt 他的回答一针见血,我已经对此进行了测试,一切正常。下面是示例代码:
static ExType TestException<ExType>(string message) where ExType:Exception, new ()
{
ExType ex = (ExType)Activator.CreateInstance(typeof(ExType), message);
return ex;
}
甜! :)
谢谢大家!
【问题讨论】:
-
坦率地说,我认为以这种方式编写一个方法(“如果它变坏,返回这种类型的异常”)可能被证明是太有问题的 wrt 边缘情况(见下面我的 cmets re. 异常类型,其中
message是不是第一个字符串arg)并且还具有(in)灵活性。回覆。后者,您可能想要设置的不仅仅是异常的消息,或者使用一些仅由调用者持有的值/变量。也许在许多情况下,可以回调以引发异常的Action委托可能更合适?