如何访问继承的值

时间:2015-05-11 21:17:23

标签: c# inheritance

我有一个带有异常变量作为参数的方法。除了默认值之外,此异常有时可以继承自定义异常中的其他值,我想知道如何在不转换为自定义异常对象或验证HResult的情况下访问这些自定义值(这将永远是相同的到期)如何方法的论点。)

例如,在某些情况下,异常对象可以继承列表,但我无法访问此列表。要使此方法返回正确的值,我必须首先找到识别异常的方法,并且通过访问继承的值,我将能够。

这是我到目前为止所尝试的:

- 异常处理方法 -

private string ExceptionHandler(Exception ex)
{
    var customExceptionMessages = string.Empty;

    //I want to avoid this
    var customException = ex as CustomException;

    if (customException != null)
    {
        //Build custom exception message
        foreach (var v in customException.CustomViolations)
        {
            customExceptionMessages += v.ErrorMessage + "<br />";
        }

        return customExceptionMessages;
    }

    else
        return ex.Message;
}

- 使用示例 -

ExceptionHandler(customEx);

调试后,我注意到在ExceptionHandler运行之前,customEx有其用户定义的值。 ExceptionHandler开始运行后,ex会继承异常的默认值和自定义值。我不能只说ex.CustomViolations因为它只在运行时存在。

2 个答案:

答案 0 :(得分:5)

覆盖自定义异常类中的属性Message,并在属性getter中构建所需的消息字符串。完成后,您只需返回ex.Message,就不必担心异常类型。

public class CustomException : Exception
{
     public override string Message
     {
         get
         {
             return <build message here>;
         }
     }
}

答案 1 :(得分:2)

通常使用Visitor pattern来实现此类目标。但是,在这里您无法修改Exception的源代码。幸运的是,在C#中,您可以使用dynamic关键字来执行此操作:

private string ExceptionHandler(ConcreteException1 ex)
//...
private string ExceptionHandler(ConcreteException2 ex)
//...
private string ExceptionHandler(Exception ex) // default

x.ExceptionHanlder((dynamic)ex); // will call an appropriate overload

当然,在内部进行类型检查,但解决方案是可扩展的 - 您唯一需要的是为每个新的异常类型添加另一个重载。

在您没有/不想要dynamic类型的情况下,另一种方法是为每个例外使用具体处理程序的字典:

Dictionary<Type, ExceptionHandler> handlers = ...

handlers[ex.GetType()].Handle(ex);

(在这个例子中,我已将ExceptionHandler更改为类名,并使用Handle作为方法名称 - 这是命名方法的首选,较少混淆的方法类型;))

您还可以使用一些通用方法魔法来避免在Handle方法中进行转换,但即使没有这种方法,您也不必检查无效的转换。