最好用一个例子来说明:
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/