2010-02-11 57 views
3

我想創建一個錯誤類。它有一些靜態屬性。例如:Message,InnerExceptionStacktrace,Source。但我想添加一些動態屬性。如何將屬性動態添加到類中

如果例外是FileNotFoundException,我想添加FileName屬性。如果是SqlException,我想添加LineNumber屬性。我無法從Exception繼承該類,因爲我從Web服務返回該類。我怎樣才能做到這一點?

回答

1

可以動態使用C#一樣匿名類型的新功能

我不知道,如果你正在嘗試做類似的一些事情,但如下

 public interface IError { } 

     public class ErrorTypeA : IError 
     { public string Name; } 

     public class ErrorTypeB : IError 
     { 
      public string Name; 
      public int line; 
     } 

     public void CreateErrorObject() 
     { 
      IError error; 
      if (FileNotFoundException) // put your check here 
      { 
       error = new ErrorTypeA 
        { 
         Name = "" 
        }; 
      } 
      elseif (InValidOpertionException) // put your check here 
      { 
       error = new ErrorTypeB 
       { 
        Name = "", 
        line = 1 
       }; 
      } 
     } 

希望能達到要求,創建類型這有助於

+0

所以你捕捉異常幷包裝它?這是處理異常的非常糟糕的方式(調用代碼將始終檢查返回值並處理異常)。這使得消費者代碼比應該更復雜。 – 2010-02-14 16:59:26

+0

此海報的要點不是異常處理的最佳做法! 請再次檢查問題 – 2010-02-14 17:17:16

0

這是很不清楚你想達到什麼。重新考慮您的設計以支持非靜態類並使用繼承。

你還記得.NET BCL中有很多現成的異常類,對吧?

2

C#是一種靜態類型語言。這意味着你通常不會在運行時向類動態添加屬性,而沒有一些真正時髦的IL注入(你一定要避免)。

在你的情況下,你似乎需要更好地理解異常 - 我們通常會拋出特定類型的異常來指出異常問題的原因。例如,如果您正在查找一個文件,但它不在那裏,則會拋出FileNotFoundException,或者如果存在某個特定於應用程序的問題,則可以創建自己的異常類並引發該異常。

請記住,例外應該是例外。

+0

曾聽說過匿名類型? – 2010-02-11 14:32:40

+0

是的,我聽說過它 - 你不能創建匿名異常,但 – 2010-02-14 16:57:16

2

,而不是試圖做一些C#目前不處理得非常好,我建議你採取一些不同的辦法。

爲什麼不在數據字典中添加這些額外的屬性?你的類可以暴露一個接口來獲得許多「屬性」(一般意義上的這個詞),也就是說,鍵和你的調用代碼可以檢查這些屬性並根據需要使用它們查找值。

0

創建一個新的異常類型,派生自Exception。拋出這個異常,並將InnerException屬性設置爲導致所有騷亂的異常。

您可以檢查內部異常的類型並相應地顯示數據。

如果可能,你當然也可以只是throw原來的excletion讓來電者處理它。

1

我接受這將是使用一個字典,您可以存儲所有額外的數據。

public class Logging 
{ 
    private Dictionary<string, string> _ExtraInfo = new Dictionary<string, string>(); 

    public Dictionary<string, string> ExtraInfo { 
     get { return _ExtraInfo; } 
     set { _ExtraInfo = value; } 
    } 

} 

要使用:

Logging MyLogger = new Logging(); 
    MyLogger.ExtraInfo.Add("Filename", thefilename); 
    MyLogger.ExtraInfo.Add("ClientTime", now); 

等。