Подтвердить что ты не робот

Переопределить функциональность '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)

Возможно ли это? Как?

4b9b3361

Ответ 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;
}