C# 从接口类型检测类

C# 从接口类型检测类,c#,reflection,interface,C#,Reflection,Interface,我有一个接口和一些继承自它的类 public interface IFoo {} public class Bar : IFoo {} public class Baz : IFoo {} 如果我得到了实现IFoo的类型,我如何确定该类型是表示条还是表示Baz(而不实际创建对象) //获取程序集中的所有类型。 键入[]theTypes=asm.GetTypes(); //查看类型是否实现IFoo。 for(int i=0;i

我有一个接口和一些继承自它的类

public interface IFoo {}
public class Bar : IFoo {}
public class Baz : IFoo {}
如果我得到了实现
IFoo
的类型,我如何确定该类型是表示
还是表示
Baz
(而不实际创建对象)

//获取程序集中的所有类型。
键入[]theTypes=asm.GetTypes();
//查看类型是否实现IFoo。
for(int i=0;i
我是不是遗漏了什么


types[i]
是类型。

t
既不是
Bar
也不是
Baz
-它是
IFoo
类型[i]
Bar
Baz

当您执行GetInFace时,您只获得界面。您需要做的只是获取实现该接口的类型,如下所示

if (theTypes[i] == typeof(Bar))
{
    // t is Bar
} 
else if (theTypes[i] == typeof(Baz))
{
    // t is Baz
}
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
      }
  }

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

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

也就是说,我真的不知道你想要实现什么。

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

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

好的,我用IsSubclassOf测试了类型[I],这是正确的比较方法吗?普通的
==
似乎不起作用。它更像是“将实现接口I的所有东西都放在基于类型的列表中”。最初的实现实际上构建了每一个对象,这显然浪费了内存,而且速度很慢。我只是存储类型,而不是按需构建对象;
IFoo obj = ...;
Type someType = obj.GetType();
if (typeof(Bar).IsAssignableFrom(someType))
    ...
if (typeof(Baz).IsAssignableFrom(someType))
    ...