覆盖'是'功能

时间:2013-12-18 08:41:18

标签: c#

我有一个类,因此包含一个例外。

public class ExceptionWrapper
{
    public string TypeName { get; set; }
    public string Message { get; set; }
    public string InnerException { get; set; }
    public string StackTrace { get; set; }

    public ExceptionWrapper() { }

    public ExceptionWrapper(Exception ex)
    {
        TypeName = String.Format("{0}.{1}", ex.GetType().Namespace, ex.GetType().Name);
        Message = ex.Message;
        InnerException = ex.InnerException != null ? ex.InnerException.Message : null;
        StackTrace = ex.StackTrace;
    }

    public bool Is(Type t)
    {
        var fullName = String.Format("{0}.{1}", t.Namespace, t.Name);
        return fullName == TypeName;
    }
}

我想覆盖'is'动作,所以不要这样做

if (ex.Is(typeof(Validator.ValidatorException)) == true)

我会这样做

if (ex is Validator.ValidatorException)

有可能吗?怎么样?

3 个答案:

答案 0 :(得分:49)

Overloadable Operators开始,可以重载以下运算符:

  • 一元:+, -, !, ~, ++, --, true, false
  • 二进制:+, -, *, /, %, &, |, ^, <<, >>
  • 比较:==, !=, <, >, <=, >=

这些运算符不能超载:

  • 逻辑:&&, ||
  • 数组索引:[]
  • 演员:(T)x
  • 作业:+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
  • 其他人:=, ., ?:, ??, ->, =>, f(x), as, checked, unchecked, default, delegate, is, new, sizeof, typeof

此外,比较运算符需要成对重载,如果你重载一个,你必须重载另一个:

  • ==!=
  • <>
  • <=>=

答案 1 :(得分:33)

直接答案是:不,is无法覆盖(因为它是关键字)。

但是你可以通过使用泛型来做更优雅的事情。首先定义您的Is()方法,如下所示:

public bool Is<T>() where T: Exception
{
    return typeof(T).FullName == this.TypeName;
}

然后你可以像这样写下你的比较:

if (ex.Is<Validator.ValidatorException>())

答案 2 :(得分:11)

is是一个非重载的关键字,但您可以编写这样的扩展方法:

public static bool Is<T>(this Object source) where T : class
{
   return source is T;
}