Использование отражения, как найти класс в сборке, которая реализует базовый базовый класс и создать его экземпляр - PullRequest
1 голос
/ 05 января 2012

У меня есть базовый класс презентаторов:

public abstract class PresenterBase<T> where T : IView
{
    //Some code  
}

Конкретный класс презентаторов, который реализует эту базу:

public class RegistrationPresenter : PresenterBase<IRegistration>
{
    //Some Code
}

Конкретная фабрика презентаторов, которая возвращает экземпляр презентатора, который зависитв конкретном интерфейсе контракта:

public class ProductPresenterFactory : PresenterFactoryBase
{
    // Some code
    public override PresenterBase<IView> GetPresenter(IView view, string name = "")
    {
        if (view == null && string.IsNullOrEmpty(name))
            throw new ArgumentNullException();
        return presenter;
    }
} 

Мне нужно реализовать метод GetPresenter.Пользователь поместит интерфейсный контракт, например, типа IRegistration в вышеупомянутом случае.Этот метод должен выяснить класс, который реализует PresenterBase<IRegistration> и вернуть экземпляр.

1 Ответ

0 голосов
/ 08 марта 2012

Я не писал это с помощью компилятора; Я мог сделать несколько ошибок.

Сначала вам нужно получить тип базы презентаций, затем мы проанализируем сборку для реализации и затем вызовем ее конструктор. Я сделаю некоторые предположения, как написано в коде.

var genericType = typeof (PresenterBase<>).MakeGenericType(new[] { view.GetType() });
var allTypes = GetType().Assembly.GetTypes(); // I assume the class is in the same assembly.
var typeToImplement = allTypes.Single(t => t.IsSubclassOf(genericType)); // I assume there is only one implementation for the given type
var constructorToCall = typeToImplement.GetConstructors().First(); // I assume there is one constructor
var presenter = constructorToCall.Invoke(new object[0]); // I assume there is no parameter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...