如何获取引用类型基类类型

时间:2014-11-14 19:53:55

标签: c# reference

所以我试图弄清楚如何获得引用的程序集基类类型。 例如,我有以下内容:

解决方案A {

..项目A

....类w

...... GetAllClassesSubclassOfClassX(){返回构造函数,如果匹配}

- 项目B

----抽象类x

------ abstract methodA()

..项目C

.... class y:x

......覆盖methodA()

- 项目D

---- class z:x

------覆盖methodA()

所以我当前的代码会撤回引用,但我不知道如何查看它们是否是特定类类型的子类。

public List<AbstractCWThirdPartyConsumer> GetAllProviders()
{
    AssemblyName[] types = Assembly.GetExecutingAssembly().GetReferencedAssemblies();

    List<AbstractCWThirdPartyConsumer> listOfAllProcessors = new List<AbstractCWThirdPartyConsumer>();
    foreach (AssemblyName type in types)
    {
        if (IsSameOrSubclass(listOfAllProcessors.GetType(), type.GetType()))
        {
             //AbstractCWThirdPartyConsumer proc = (AbstractCWThirdPartyConsumer)type.GetConstructor(Type.EmptyTypes).Invoke(null);
             //listOfAllProcessors.Add(proc);
        }
    }

        return listOfAllProcessors;
    }

    public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
    {
        return potentialDescendant.IsSubclassOf(potentialBase);
    }
}

任何纠正我的问题的帮助都会有所帮助!提前谢谢。

1 个答案:

答案 0 :(得分:1)

为什么不使用Type.IsSubclassOf

像这样重写你的方法。

public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
    return potentialDescendant.IsSubclassOf(potentialBase);
}

另外,我确实鼓励你的方法枚举程序集中的所有类型都是不正确的,所以这里是一个重写的版本,应该符合你的意图:

using System.Linq;
...
public List<AbstractCWThirdPartyConsumer> GetAllProviders()
{
    IEnumerable<Assembly> referencedAssemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies().Select(Assembly.Load);

    List<AbstractCWThirdPartyConsumer> listOfAllProcessors = new List<AbstractCWThirdPartyConsumer>();
    foreach (Assembly assembly in referencedAssemblies)
    {
        foreach(Type type in assembly.ExportedTypes)
        {
            if (IsSameOrSubclass(typeof(AbstractCWThirdPartyConsumer), type))
            {
             //AbstractCWThirdPartyConsumer proc = (AbstractCWThirdPartyConsumer)Activator.CreateInstance(type);
             //listOfAllProcessors.Add(proc);
            } 
        }
    }
    return listOfAllProcessors;
}

public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
    return potentialDescendant.IsSubclassOf(potentialBase);
}

或者,如果你真的想把它挤进一个Linq-Method-Chain:

public List<AbstractCWThirdPartyConsumer> GetAllProviders()
{
     return Assembly.GetExecutingAssembly()
             .GetReferencedAssemblies()
             .Select(Assembly.Load)
             .SelectMany(asm => asm.ExportedTypes)
             .Where(exportedType => exportedType.IsSubclassOf(typeof(AbstractCWThirdPartyConsumer)))
             .Select(exportedType => (AbstractCWThirdPartyConsumer) Activator.CreateInstance(exportedType))
             .ToList();
}