Есть ли «дешевый и простой» способ узнать, реализует ли объект явный / неявный оператор приведения к определенному типу?

Лучше всего это проиллюстрировать на примере:

class Cat
{
}

class Dog
{
    public static implicit operator Cat(Dog d)
    {
        return new Cat();
    }
}

Я хочу сказать для произвольного объекта, могу ли я преобразовать его в Cat. К сожалению, похоже, что я не могу использовать оператор is / as.

void Main()
{
    var d = new Dog();
    if (d is Cat) throw new Exception("d is Cat");
    var c1 = (Cat)d; // yes
    //var c2 = d as Cat; // Won't compile: Cannot convert type 'Dog' to 'Cat' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion

}

Я надеюсь избежать попытки / улова (InvalidCastException), так как я могу делать это много и это будет довольно дорого.

Есть ли способ сделать это дешево и легко?

редактировать: Спасибо за ответы, ребята - голоса за всех, жаль, что я не могу дать вам всю отметку, но это будет Марку для наиболее общего решения (бонусное голосование для того, чтобы пробить его на iPod). Однако решение Жордао удалось отточить то, что мне нужно , а не то, о чем я просил, так что, вероятно, это то, с чем я собираюсь.

9
задан fostandy 9 November 2010 в 00:26
поделиться