加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 有没有一种“便宜而简单”的方式来告诉对象是否实现了特定

发布时间:2020-12-15 06:57:18 所属栏目:百科 来源:网络整理
导读:这最好用一个例子说明: 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
这最好用一个例子说明:
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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读