簡體   English   中英

C#可以有一個通用的返回類型嗎?

[英]C# Possible to have a generic return type?

這是一個返回true / false的典型函數;

private static bool hasValue()
{
    return true; 
}

現在出錯了,我想返回我自己的自定義錯誤對象的定義:

public class Failure
    {
        public string FailureDateTime { get; set; }
        public string FailureReason { get; set; }
    }

我原以為能夠拋出這個自定義對象...

private static bool hasValue()
{
    try
        {
           ...do something
        }
    catch 
        {
         throw new Failure();
         }
    return true; 
}

這是不可能的,我不想從System.IO.Exception派生Failure,因為我個人在C#中序列化異常時遇到了問題(這與.net v2有關)。

這個問題的最佳實踐/或理想解決方案是什么。 我應該使用私有靜態對象嗎? 或者是否有更簡潔的方法來返回自定義對象或繞過錯誤的典型返回類型(不使用System.IO.Exception)?

我對使用對象也不是很瘋狂,因為那時我需要使用強制轉換和更多布爾值來驗證結果。

這種解決方案可能適合這種情況:

var exception = new Exception();
exception.Data.Add("Failure", new Failure());
throw exception;

您可以拋出異常(建議定義您自己的異常類型),並使用Data字典來保存Failure。 catch代碼中,您可以獲取數據並將其序列化。 如果您確實創建了自己的異常類型,則可以將失敗放在屬性上。

評論:我沒有檢查,但你確定異常不可序列化嗎?

我不想從System.IO.Exception派生Failure,因為無法在C#中序列化異常。

此問題所基於的假設是您無法序列化從IOException派生的異常。 但是,我希望挑戰這一假設。 IOException標記為Serializable 您所要做的就是將您的子類標記為可序列化。

請參閱IOException的文檔:

[SerializableAttribute]
[ComVisibleAttribute(true)]
public class IOException : SystemException

如果要創建自己的異常類,則需要從System.Exception (或其他任何非sealed子類)派生。 無法序列化您正在談論的可能是您沒有實現序列化構造函數。

Visual Studio有一個代碼片段,用於創建用於子類化異常的推薦模板。 您可以通過鍵入exception並按Tab鍵兩次來獲取它。

這是出來的:

[Serializable]
public class MyException : Exception {
    public MyException() { }
    public MyException(string message) : base(message) { }
    public MyException(string message, Exception inner) : base(message, inner) { }
    protected MyException(
      System.Runtime.Serialization.SerializationInfo info,
      System.Runtime.Serialization.StreamingContext context)
        : base(info, context) { }
}

Inerit來自Exception並使您的對象可序列化

不要過分擔心這種情況; 只需創建一個結果類型來封裝所有這些邏輯。

public class ValueResult
{
  public Failure FailureDetails {get;set;}
  public bool Success {get;set;}
  public bool HasValue {get;set;}
  public object Value {get;set;}
}

var result = HasValue();
if(result.Success)
  DoSomething(result.Value);
else if(!result.Success)
  LogFailure(result.FailureDetails);

你必須創建一個繼承自Exception的類,如下所示:

[Serializable]
public class Failure: Exception
{
    public string ErrorMessage
    {
      get
       {
         return base.Message.ToString();
       }
    }

}

然后

catch(Exception ex)
{
    throw new Failure(
          "exception message here", ex.messege);
}

此外,您始終可以使用企業庫異常處理來自定義異常,為異常處理,格式化類型,日志記錄等提供您自己的類...

try
{
}
catch(Exception ex)
{
    bool rethrow = ExceptionPolicy.HandleException(ex, "My Custom Policy");
    if (rethrow)
    {
        throw;
    }
}
finally
{
}

例子:

http://weblogs.asp.net/sukumarraju/archive/2009/10/04/microsoft-enterprise-library-4-1-exception-handling-block.aspx

http://www.imason.com/imason_Blogs/b/suleman_ibrahim/archive/2009/05/25/configuring-enterprise-library-4-0-for-exception-handling-and-logging.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM