C#可以有一个通用的返回类型吗?

时间:2010-06-03 11:23:06

标签: c#

这是一个返回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)?

我对使用对象也不是很疯狂,因为那时我需要使用强制转换和更多布尔来验证结果。

7 个答案:

答案 0 :(得分:10)

这种解决方案可能适合这种情况:

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

您可以抛出异常(建议您定义自己的异常类型),并使用Data字典来保存Failure。在catch代码中,您可以获取数据并对其进行序列化。如果您确实创建了自己的异常类型,则可以将失败放在属性上。

评论:我没有检查,但您确定异常不可序列化吗?

答案 1 :(得分:7)

  

我不想从System.IO.Exception派生Failure,因为无法在C#中序列化异常。

此问题所基于的假设是您无法序列化从IOException派生的异常。但是,我希望挑战这一假设。 IOException被标记为Serializable。您所要做的就是将您的子类标记为可序列化。

请参阅IOException的文档:

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

答案 2 :(得分:6)

如果要创建自己的异常类,则需要从System.Exception(或其他任何非sealed子类)派生。无法序列化您正在谈论的可能是您没有实现序列化构造函数。

Visual Studio有一个代码段,可以为子类化异常创建推荐的模板。您可以输入exception并按两次标签来获取它。

这就是出现的结果:

[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) { }
}

答案 3 :(得分:1)

从Exception开始,让你的对象可序列化

答案 4 :(得分:0)

不要过分担心这种情况;只需创建一个结果类型来封装所有这些逻辑。

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);

答案 5 :(得分:0)

你必须创建一个继承自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);
}

答案 6 :(得分:0)

此外,您始终可以使用企业库异常处理来自定义异常,为异常处理,格式化类型,日志记录等提供您自己的类...

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