从接口类型中检测类

时间:2009-07-14 21:26:56

标签: c# reflection interface

我有一个接口,以及一些继承它的类。

public interface IFoo {}
public class Bar : IFoo {}
public class Baz : IFoo {}

如果我获得了实现IFoo的类型,我该如何判断该类型是代表Bar还是Baz(而不是实际创建对象)?

// Get all types in assembly.
Type[]          theTypes = asm.GetTypes();

// See if a type implement IFoo.
for (int i = 0; i < theTypes.Length; i++)
{
    Type    t = theTypes[i].GetInterface("IFoo");
    if (t != null)
    {
        // TODO: is t a Bar or a Baz?
    }
}

6 个答案:

答案 0 :(得分:4)

if (theTypes[i] == typeof(Bar))
{
    // t is Bar
} 
else if (theTypes[i] == typeof(Baz))
{
    // t is Baz
}

答案 1 :(得分:3)

t既不是Bar也不是Baz - 它是IFootheTypes[i]BarBaz

答案 2 :(得分:2)

当您执行GetInerface时,您只能获得界面。您需要做的只是获取实现该接口的类型。

var theTypes = asm.GetTypes().Where(
                                    x => x.GetInterface("IFoo") != null
                                    ); 

现在你可以遍历它们并执行此操作。或使用开关。

foreach ( var item in theTypes )
  {
     if ( item == typeof(Bar) ) 
      {
         //its Bar
      }
     else if ( item == typeof(Baz) )
      {
        ///its Baz
      }
  }

答案 3 :(得分:1)

我认为这有助于解决您的问题:

IFoo obj = ...;
Type someType = obj.GetType();
if (typeof(Bar).IsAssignableFrom(someType))
    ...
if (typeof(Baz).IsAssignableFrom(someType))
    ...

答案 4 :(得分:0)

我错过了什么吗?

theTypes[i]是类型。

答案 5 :(得分:0)

支持分析/重构的“Type X实现接口I”的强类型解决方案是:

Type x = ...;
bool implementsInterface = Array.IndexOf(x.GetInterfaces(), typeof(I)) >= 0;

那就是说,我真的不知道你想要完成什么。