我有3个具有相同界面的类:
cppTopicGenerator:TopicGeneratorphpTopicGenerator:TopicGeneratorjavaTopicGenerator:TopicGenerator我为他们创造了一个立面,我试着……
您可以从Assembly中反映它们,然后通过Activator实例化它们:
public MyFacade() { //Reflect them var type = typeof(TopicGenerator); var types = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(s => s.GetTypes()) .Where(p => type.IsAssignableFrom(p) && !p.IsInterface); //Instantiate them generators = types.Select(t => Activator.CreateInstance(t) as TopicGenerator).ToList(); }
通过这种方式,您可以找到实现TopicGenerator的所有类,如果您创建一个新类,则无需手动添加它们。
您可以使用以下方法生成列表。
var list = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(x => x.GetTypes()) .Where(p => typeof(TopicGenerator).IsAssignableFrom(p) && p.IsClass && !p.IsAbstract) .Select(x => (TopicGenerator)Activator.CreateInstance(x)).ToList<TopicGenerator>();
它的作用是,它反映并迭代汇编中的类型并检查是否实现了特定的接口。该 !p.IsAbstract 将确保未列出抽象类。
!p.IsAbstract
您可以使用 反射 为达到这个。
private static readonly List<TopicGenerator> generators = Assembly.GetExecutingAssembly().GetTypes() .Where(x => x.ImplementedInterfaces.Contains(typeof(TopicGenerator))) .Select(x => (TopicGenerator)Activator.CreateInstance(x)) .ToList();