为完成该功能,我写了下面两个方法,记录下来,为以后使用。
1,这个方法使用了DesignTime下的ITypeDiscoveryService,可以在DesignTime下使用。不过VS2008以下的ITypeDiscoveryService实现逻辑有Bug,不会搜索baseType所在的程序集,所有需要先搜索baseType所在的程序集。
if (host == null) { throw new ArgumentNullException("host"); } if (baseType == null) { throw new ArgumentNullException("baseType"); } List<Type> derivedTypes = new List<Type>();
// Find derived types from base type's assembly. // if (!excludeGlobalTypes || !baseType.Assembly.GlobalAssemblyCache) { Type[] baseTypes = baseType.Assembly.GetTypes(); foreach (Type type in baseTypes) { if ((type.IsPublic || type.IsNestedPublic) && baseType.IsAssignableFrom(type)) {
} } } // // Find derived types by ITypeDiscoveryService. // ITypeDiscoveryService service = host.GetService(typeof(ITypeDiscoveryService)) as ITypeDiscoveryService; if (service != null) { ICollection discoveryTypes = service.GetTypes(baseType, excludeGlobalTypes); foreach (Type type in discoveryTypes) { if (!derivedTypes.Contains(type))
} } } return derivedTypes.ToArray();
|
if (baseType == null) { throw new ArgumentNullException("baseType"); } List<Type> derivedTypes = new List<Type>(); AssemblyName baseAssemblyName = baseType.Assembly.GetName(); // // Find derived types from CurrentDomain. // Assembly[] assemblys = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly assembly in assemblys) { // Important, It can improve performance. bool needSearch = false; if (!excludeGlobalTypes || !assembly.GlobalAssemblyCache) { if (string.Equals(assembly.FullName, baseAssemblyName.FullName, StringComparison.OrdinalIgnoreCase)) { needSearch = true; } else { AssemblyName[] referencedAssemblies = assembly.GetReferencedAssemblies(); foreach (AssemblyName assemblyName in referencedAssemblies) { if (string.Equals(assemblyName.FullName, baseAssemblyName.FullName, StringComparison.OrdinalIgnoreCase)) { needSearch = true; break; } } } } if (needSearch) { Type[] types = assembly.GetTypes(); foreach (Type type in types) { if ((type.IsPublic || type.IsNestedPublic) && baseType.IsAssignableFrom(type) && !derivedTypes.Contains(type)) {
} } } } return derivedTypes.ToArray(); } |

添加至收藏夹