这可能是一个很长的镜头,但.NET的灵活性永远不会让我感到惊讶,所以这里就是这样。
我正在开发一个MVC应用程序,需要在一组程序集中搜索从公共基类派生的类类型。
即。我有几个具有活动类型的程序集,这些活动类型都派生自ActivityBase。这些程序集将放在特定目录中。它们有点像插件。由于它们需要在运行时动态加载,因此它们还需要伴随一些依赖项(除非我能找到一种方便的方法来分离它们,所以也可以随意加入它。)
我的代码将遍历此目录中的所有.DLL文件,加载程序集,并遍历程序集中的所有类型以查找从ActivityBase派生的类型。
这很好用。但是,我想避免加载和搜索没有活动的程序集,因为某些依赖项有数千种类型,这就成了性能问题。
所以我想我的问题是,除了文件命名约定之外,是否有任何方法可以“装饰”或使用某种类型的数据标记程序集,这些数据表明它是一个活动程序集,可以很容易地在构建时间并在运行时轻松读取?
欢迎任何其他处理此问题的建议。
答案 0 :(得分:7)
您可以实现自己的程序集属性:
[AttributeUsage(AttributeTargets.Assembly)]
public class ActivityAssemblyAttribute : Attribute
{
}
然后用这个属性装饰必要的程序集:
[assembly: ActivityAssemblyAttribute()]
并且,在需要时,只需检查所讨论的装配是否使用此属性进行修饰:
ActivityAssemblyAttribute attribute = null;
object[] attributes = assembly.GetCustomAttributes(typeof(ActivityAssemblyAttribute), false);
if (attributes.Length > 0)
{
attribute = attributes[0] as ActivityAssemblyAttribute;
}