3

我需要解释一下才能解决问题。

我有3个项目:

项目 1 可以看到项目 2 和 3。

项目 2 可以看到项目 3。

项目 3 是一个 dll,其他的是应用程序。

我必须设计一个有很多子类的类。子类都有一个在基类中声明为抽象的方法,因此它们都必须使用它。它们需要分布在所有项目中,因为方法中的代码直接与项目交互。

抽象基类在项目 3 中,子类在 2 和 1 中。我遇到的问题是:

这是我写的方法:

   public static IEnumerable<Type> GetSubClasses(Type typ)
   {
       IEnumerable<Type> subclasses =
       from type in Assembly.GetAssembly(typ).GetTypes()
       where type.IsSubclassOf(typ) && !type.IsAbstract
       select type;
       return subclasses;
   }

我正在尝试获取该类型的所有子类,但是当我这样做时,我只从当前项目中获取子类。例如,如果我尝试从项目 1 中获取它们,我不会从项目 2 中获取子类。

我怎么做?我知道我可以从项目 2 中获得程序集引用,但它没有 GetAssembly(Type t) 方法,借助它我得到了所有子类。如果它会是一样的,我只需要在那里做同样的事情。

我的第二个问题是,有没有更简单的方法?在许多项目中都有这些类有点..“大”,也许有一种解决方案可以让它们成为一个。就像我说的,他们都需要拥有的方法的代码,需要直接与他们所在的项目进行交互。

4

3 回答 3

1

问题是你在打电话Assembly.GetTypes()。这只会为您提供该特定程序集中的类。如果您有Assembly所有三个程序集的对象,您可以执行类似的操作

assem1.GetTypes()
.Concat(assem2.GetTypes())
.Concat(assem3.GetTypes())

所以问题是如何获得这三个Assembly对象。从项目 1 你可以说

var assem1 = typeof(SomeClassInProj1).Assembly;
var assem2 = typeof(SomeClassInProj2).Assembly;
var assem3 = typeof(SomeClassInProj3).Assembly;

在您无法“看到”其他程序集的项目中,您需要加载它们。请参阅 的文档Assembly.Load

于 2012-11-08T09:23:11.690 回答
0

您必须加载所有可能包含您想要查找的类型的程序集,并像在循环中那样查找类型。

我已经做了类似的事情来从当前应用程序 bin 文件夹中的程序集中获取所有类的列表,这些类继承自某个基类:

// load all files from current dir which ends with `.dll`
var q = from s in Directory.GetFiles(Directory.GetCurrentDirectory(), "*.dll")
        select s;

var types = q.Select(s => getTypes(s, myBaseType))
             .SelectMany(typeList => typeList).ToList();

和函数getTypes:

IEnumerable<Type> getTypes(string filePath, Type baseType) {
    Assembly a = Assembly.LoadFrom(filePath);
    return a.GetTypes().Where(t => t.IsSubclassOf(baseType) && !t.IsAbstract);
}

您必须处理一些例外情况,例如BadImageFormatException当您的文件夹中有不是 .net 程序集的 dll 时。

另一种方法可能是配置要检查的程序集列表。

于 2012-11-08T08:57:52.273 回答
0

任何基类或接口都不应该知道或关心它的继承者或实现者。任何交互都应仅限于被覆盖的抽象或虚拟成员。

同样,导出公共类型的程序集并非旨在了解有关导入程序的任何信息。使用“早期绑定”这样做会创建一个循环引用。

您可以想象地反映加载到您的应用程序域中的所有程序集,并查看哪些程序集从某个类型继承,但是,您打算如何处理这些信息?可能有一种更简单、更快的方法来实现这一目标。

于 2012-11-08T09:15:57.227 回答