c# - 是否有一种 "cheap and easy"方法可以判断一个对象是否对特定类型实现了显式/隐式转换运算符?

标签 c# casting

最好用一个例子来说明:

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

}

我希望避免 try/catch(InvalidCastException),因为我可能会经常这样做,而且这会非常昂贵。

有没有办法既便宜又容易地做到这一点?

编辑:感谢大家的回答 - 投票给所有人,希望我能给你所有的勾选,但最通用的解决方案将由 Marc 投票(奖励投票用于在iPod)。然而,Jordao 的解决方案设法磨练了我需要的东西,而不是我要求的东西,所以它可能就是我要用的东西。

最佳答案

is/as 不检查转换运算符。您需要使用反射来检查和调用上述运算符。我会写一个通用的静态类

static class Convert<TFrom,TTo> {}

然后在静态构造函数中检查该方法,使用 Delegate.CreateDelegate 创建一个

Func<TFrom,TTo>

并将其存储在静态字段中。然后您可以快速访问类型化方法:

public static TTo Convert(TFrom obj) { return del(obj); }
public static bool CanConvert { get { return del != null; } }
private static readonly Func<TFrom,TTo> del;

关于c# - 是否有一种 "cheap and easy"方法可以判断一个对象是否对特定类型实现了显式/隐式转换运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4126217/

相关文章:

c - C cast 的真正作用是什么?

c++ - 智能指针 : cast between base and derived classes

c# - 类的类型为空

c# - 如何将文件移动到目录而不替换文件?

c++ - 将数组数组转换为指针数组

java - Java 中的动态转换

java - 显式转换背后的逻辑

c# - MonoGame 3.0.1 Xamarin 5.0.1 插件错误

c# - 通过 C# 服务引用使用 Java Web 服务

c# - 我可以检测我的 HttpModule 中的内容是否已压缩吗?