none
如何判断某个对象是否实现了特定的范型接口? RRS feed

  • 问题

  • 如何判断某个对象是否实现了特定的范型接口?

    比如我想判断任意一个obj 是否实现了 IEnumerable<>接口,无论T是什么定义。 

    这里关键就是我不知道怎么忽略T的前提下判断IEnumerable<>。 因为T可能是任意不可预知的类型,所以不能用obj.GetType() == typeof(IEnumerable<T>)来判断。

    这个应该怎么写呢? 谢谢


    信奎爷,无所畏惧!!
    2011年4月5日 6:45

答案

  • 这个问题可以用这个:

    if (args.GetType().GetInterface("IEnumerable`1") != null) 
    {
        Console.WriteLine("True");             
    }

    Mark Zhou
    2011年4月5日 8:52
  • 补充一下,因为 IEnumerable<> 是一个开放类型,而 is, as, == 等操作符只能判断封闭类型,所以需要用到反射。IEnumerable`1 是 CLR 对 IEnumerable<T> 的名称。就像在 VB 中的 IEnumerable`1 叫 IEnumerable(Of T)


    Mark Zhou
    2011年4月5日 8:55
  • 补充一下,因为 IEnumerable<> 是一个开放类型,而 is, as, == 等操作符只能判断封闭类型,所以需要用到反射。IEnumerable`1 是 CLR 对 IEnumerable<T> 的名称。就像在 VB 中的 IEnumerable`1 叫 IEnumerable(Of T)


    Mark Zhou

    哇,真的是非常感谢! 过去我只知道GetInterface("IEnumerable`1")可以取到所要的Type,但却没有想到还可以用它来判断是否继承了某个泛型接口。真的是需要经验与技巧呀!
    信奎爷,无所畏惧!!
    2011年4月6日 1:45

全部回复

  • 两种方式:

    1.查文档

    2.用反射

    2011年4月5日 7:10
  • 这个问题可以用这个:

    if (args.GetType().GetInterface("IEnumerable`1") != null) 
    {
        Console.WriteLine("True");             
    }

    Mark Zhou
    2011年4月5日 8:52
  • 补充一下,因为 IEnumerable<> 是一个开放类型,而 is, as, == 等操作符只能判断封闭类型,所以需要用到反射。IEnumerable`1 是 CLR 对 IEnumerable<T> 的名称。就像在 VB 中的 IEnumerable`1 叫 IEnumerable(Of T)


    Mark Zhou
    2011年4月5日 8:55
  • 补充一下,因为 IEnumerable<> 是一个开放类型,而 is, as, == 等操作符只能判断封闭类型,所以需要用到反射。IEnumerable`1 是 CLR 对 IEnumerable<T> 的名称。就像在 VB 中的 IEnumerable`1 叫 IEnumerable(Of T)


    Mark Zhou

    哇,真的是非常感谢! 过去我只知道GetInterface("IEnumerable`1")可以取到所要的Type,但却没有想到还可以用它来判断是否继承了某个泛型接口。真的是需要经验与技巧呀!
    信奎爷,无所畏惧!!
    2011年4月6日 1:45