2014-11-14 2 views
0

Итак, я пытаюсь выяснить, как получить базовый класс ссылочных классов. Например, у меня есть следующие:Как получить ссылочные типы базового класса типа

Раствор А {

..Project

.... класс ж

...... GetAllClassesSubclassOfClassX() {возвращение конструктора, если } соответствует

--Project Б

---- абстрактный класс х

------ абстрактные Methoda()

..Project С

.... класс у: х

...... переопределить Methoda()

--Project D

---- класс г: х

------ переопределить Methoda()

Итак, мой текущий код возвращает ссылки, но я не уверен, как определить, являются ли они подклассами определенного типа класса.

public List<AbstractCWThirdPartyConsumer> GetAllProviders() 
{ 
    AssemblyName[] types = Assembly.GetExecutingAssembly().GetReferencedAssemblies(); 

    List<AbstractCWThirdPartyConsumer> listOfAllProcessors = new List<AbstractCWThirdPartyConsumer>(); 
    foreach (AssemblyName type in types) 
    { 
     if (IsSameOrSubclass(listOfAllProcessors.GetType(), type.GetType())) 
     { 
      //AbstractCWThirdPartyConsumer proc = (AbstractCWThirdPartyConsumer)type.GetConstructor(Type.EmptyTypes).Invoke(null); 
      //listOfAllProcessors.Add(proc); 
     } 
    } 

     return listOfAllProcessors; 
    } 

    public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant) 
    { 
     return potentialDescendant.IsSubclassOf(potentialBase); 
    } 
} 

Любая помощь с исправлением моей проблемы была бы полезна! Заранее спасибо.

+0

У вас не может быть абстрактных проектов, и проекты не наследуются друг от друга. Я предполагаю, что «Project A, Project B, ...» являются классами? – PoweredByOrange

+0

Что такое решение A? Что такое проект A, B, ...? Как проект может быть абстрактным? Какие ссылки какие? Что означают обратные ссылки? Переменная типа - экземпляр AssemblyName, вызывающий type.GetType() даст вам typeof (AssemblyName), что вы хотите с этим сделать? Чего вы хотите достичь? – fejesjoco

+0

Прошу прощения. да Проекты C и Project D имеют классы, которые относятся к классу Project B. сделав редактирование сейчас. –

ответ

1

Почему вы не используете Type.IsSubclassOf.

Перепишите свой метод, как это должно быть сделано.

public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant) 
{ 
    return potentialDescendant.IsSubclassOf(potentialBase); 
} 

Также я сделать bellieve свой подход, чтобы перечислить все типы в сборках неверен, так вот переписаны версия, которая должна Fitt свое намерение:

using System.Linq; 
... 
public List<AbstractCWThirdPartyConsumer> GetAllProviders() 
{ 
    IEnumerable<Assembly> referencedAssemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies().Select(Assembly.Load); 

    List<AbstractCWThirdPartyConsumer> listOfAllProcessors = new List<AbstractCWThirdPartyConsumer>(); 
    foreach (Assembly assembly in referencedAssemblies) 
    { 
     foreach(Type type in assembly.ExportedTypes) 
     { 
      if (IsSameOrSubclass(typeof(AbstractCWThirdPartyConsumer), type)) 
      { 
      //AbstractCWThirdPartyConsumer proc = (AbstractCWThirdPartyConsumer)Activator.CreateInstance(type); 
      //listOfAllProcessors.Add(proc); 
      } 
     } 
    } 
    return listOfAllProcessors; 
} 

public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant) 
{ 
    return potentialDescendant.IsSubclassOf(potentialBase); 
} 

Или, если вы действительно хотите, чтобы сжать его в один Linq-Method-Chain:

public List<AbstractCWThirdPartyConsumer> GetAllProviders() 
{ 
    return Assembly.GetExecutingAssembly() 
      .GetReferencedAssemblies() 
      .Select(Assembly.Load) 
      .SelectMany(asm => asm.ExportedTypes) 
      .Where(exportedType => exportedType.IsSubclassOf(typeof(AbstractCWThirdPartyConsumer))) 
      .Select(exportedType => (AbstractCWThirdPartyConsumer) Activator.CreateInstance(exportedType)) 
      .ToList(); 
} 
+0

Очень приятно. Но я вижу, где я был испорчен. Это очень помогло. Благодаря! Мне пришлось изменить ExportedTypes на GetExportedTypes() как im, используя .Net 3.5 для всех, кто сталкивается с этим решением. –

+0

Следует отметить, что ExportedTypes означает его только общедоступные типы, если это имеет значение для вас. Если это проблема, используйте GetTypes. – CSharpie