Переопределить функциональность 'is'
У меня есть класс, поэтому он содержит исключение.
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)
Возможно ли это? Как?
Ответы
Ответ 1
Из Перегружаемые операторы следующие операторы могут быть перегружены:
- Unary:
+, -, !, ~, ++, --, true, false
- Двоичный:
+, -, *, /, %, &, |, ^, <<, >>
- Сравнение:
==, !=, <, >, <=, >=
И эти операторы не могут быть перегружены:
- Логический:
&&, ||
- Индексирование массива:
[]
- В ролях:
(T)x
- Назначение:
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
- Другие:
=, ., ?:, ??, ->, =>, f(x), as, checked, unchecked, default, delegate, is, new, sizeof, typeof
Кроме того, операторы сравнения должны быть перегружены попарно, если вы перегружаете один, вы должны перегрузить другое:
Ответ 2
Прямой ответ: Нет, is
нельзя переопределить (потому что это ключевое слово).
Но вы могли бы сделать что-то более элегантное, используя дженерики. Сначала определите свой метод Is()
следующим образом:
public bool Is<T>() where T: Exception
{
return typeof(T).FullName == this.TypeName;
}
Затем вы можете написать свое сравнение следующим образом:
if (ex.Is<Validator.ValidatorException>())
Ответ 3
is
- это неперегруженное ключевое слово, но вы можете написать метод расширений следующим образом:
public static bool Is<T>(this Object source) where T : class
{
return source is T;
}