2011-11-17 84 views
4

我想基於傳遞給方法的異常類型參數拋出異常。基於類型參數實例化新對象

這是我有這麼遠,但我不希望指定每種例外情況:

public void ThrowException<T>(string message = "") where T : SystemException, new() 
    { 
     if (ConditionMet) 
     { 
      if(typeof(T) is NullReferenceException) 
       throw new NullReferenceException(message); 

      if (typeof(T) is FileNotFoundException) 
       throw new FileNotFoundException(message); 

      throw new SystemException(message); 
     } 
    } 

理想我想這樣做new T(message)給我的SystemException基本類型我會認爲這是可能的。

+0

不能完成,但也有變通方法。看到這裏:http://stackoverflow.com/questions/7772414/can-i-use-generic-constraints-to-enable-a-parameterized-constructor/7772426#7772426 –

+2

另外,請注意,它是不是很好的做法在用戶代碼中拋出異常,例如NullReferenceException。 –

回答

6

我不認爲你可以單獨使用gerics。你需要使用反射。喜歡的東西:

throw (T)Activator.CreateInstance(typeof(T),message); 
+0

由於無法拋出「物體」,因此請記住投射到'T'或'Exception' – Ray

+0

謝謝!更新以反映演員表 – flipchart

+0

我還建議您添加一個明確的檢查,即該類型支持期望的構造函數,並在檢查失敗時引發有意義的異常。 – Yaur

1

正如其他人指出使用

Activator.CreateInstance(typeof(T),message); 

更多,這隻能與反思完成。但是你可以刪除該類型參數和實例化異常傳遞給函數:

public void ThrowException(Exception e) 
{ 
    if (ConditionMet) 
    { 
     if(e is NullReferenceException || e is FileNotFoundException) 
     { 
      throw e; 
     } 

     throw new SystemException(e.Message); 
    } 
} 

用法:

// throws a NullReferenceException 
ThrowException(new NullReferenceException("message")); 
// throws a SystemException 
ThrowException(new NotSupportedException("message"));