反射生成子类,可以避免写一些机械代码。不用每次子类数量变更时,都要修改子类生成器的代码。
using System; using System.Collections.Generic; using System.Linq; namespace YYX.ReflectionSomething { public static class DerivedClassesFinder { public static IEnumerable<T> Find<T>() where T : class { var type = typeof(T); var tEnumerable = AppDomain .CurrentDomain .GetAssemblies() .SelectMany(assembly => { var types = assembly.GetTypes(); var findTypes = types.Where(derivedClass => derivedClass.IsSubclassOf(type) && !derivedClass.IsAbstract); return findTypes.Select(derivedClass => (T)assembly.CreateInstance(derivedClass.FullName, true)); }); return tEnumerable; } } }
接口也可以用类似写法
using System; using System.Collections.Generic; using System.Linq; namespace YYX.ReflectionSomething { public static class ImplementInterfaceFinder { public static IEnumerable<T> Find<T>() { var type = typeof(T); var tEnumerable = AppDomain .CurrentDomain .GetAssemblies() .SelectMany(assembly => { var types = assembly.GetTypes(); var findTypes = types.Where(derivedClass => derivedClass.GetInterfaces().Contains(type) && !derivedClass.IsAbstract); return findTypes.Select(derivedClass => (T)assembly.CreateInstance(derivedClass.FullName, true)); }); return tEnumerable; } } }