这最好用一个例子说明:
class Cat { } class Dog { public static implicit operator Cat(Dog d) { return new 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),因为我可能会做很多,这将是相当昂贵的.
有没有办法便宜而轻松地做到这一点?
编辑:感谢您的答案 – 所有人的投票,希望我可以给你所有的Tick,但它将马克为最通用的解决方案(奖金投票在一个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;