我想創建一個錯誤類。它有一些靜態屬性。例如:Message
,InnerException
,Stacktrace
,Source
。但我想添加一些動態屬性。如何將屬性動態添加到類中
如果例外是FileNotFoundException
,我想添加FileName
屬性。如果是SqlException
,我想添加LineNumber
屬性。我無法從Exception
繼承該類,因爲我從Web服務返回該類。我怎樣才能做到這一點?
我想創建一個錯誤類。它有一些靜態屬性。例如:Message
,InnerException
,Stacktrace
,Source
。但我想添加一些動態屬性。如何將屬性動態添加到類中
如果例外是FileNotFoundException
,我想添加FileName
屬性。如果是SqlException
,我想添加LineNumber
屬性。我無法從Exception
繼承該類,因爲我從Web服務返回該類。我怎樣才能做到這一點?
可以動態使用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
};
}
}
希望能達到要求,創建類型這有助於
這是很不清楚你想達到什麼。重新考慮您的設計以支持非靜態類並使用繼承。
你還記得.NET BCL中有很多現成的異常類,對吧?
C#是一種靜態類型語言。這意味着你通常不會在運行時向類動態添加屬性,而沒有一些真正時髦的IL注入(你一定要避免)。
在你的情況下,你似乎需要更好地理解異常 - 我們通常會拋出特定類型的異常來指出異常問題的原因。例如,如果您正在查找一個文件,但它不在那裏,則會拋出FileNotFoundException,或者如果存在某個特定於應用程序的問題,則可以創建自己的異常類並引發該異常。
請記住,例外應該是例外。
曾聽說過匿名類型? – 2010-02-11 14:32:40
是的,我聽說過它 - 你不能創建匿名異常,但 – 2010-02-14 16:57:16
,而不是試圖做一些C#目前不處理得非常好,我建議你採取一些不同的辦法。
爲什麼不在數據字典中添加這些額外的屬性?你的類可以暴露一個接口來獲得許多「屬性」(一般意義上的這個詞),也就是說,鍵和你的調用代碼可以檢查這些屬性並根據需要使用它們查找值。
創建一個新的異常類型,派生自Exception。拋出這個異常,並將InnerException屬性設置爲導致所有騷亂的異常。
您可以檢查內部異常的類型並相應地顯示數據。
如果可能,你當然也可以只是throw
原來的excletion讓來電者處理它。
我接受這將是使用一個字典,您可以存儲所有額外的數據。
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);
等。
所以你捕捉異常幷包裝它?這是處理異常的非常糟糕的方式(調用代碼將始終檢查返回值並處理異常)。這使得消費者代碼比應該更復雜。 – 2010-02-14 16:59:26
此海報的要點不是異常處理的最佳做法! 請再次檢查問題 – 2010-02-14 17:17:16