我有一个类,因此包含一个例外。
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)
有可能吗?怎么样?
答案 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;
}