Сведения о вопросе

Fedya

13:29, 21st August, 2020

Теги

Как найти реализацию интерфейса C# в текущей assembly с определенным именем?

Просмотров: 471   Ответов: 4

У меня есть интерфейс под названием IStep , который может выполнять некоторые вычисления (см. " Выполнение в Царстве существительных "). Во время выполнения я хочу выбрать соответствующую реализацию по имени класса.

// use like this:
IStep step = GetStep(sName);



  Сведения об ответе

davran

03:58, 29th August, 2020

Ваш вопрос очень запутан...

Если вы хотите найти типы, которые реализуют IStep, то сделайте это:

foreach (Type t in Assembly.GetCallingAssembly().GetTypes())
{
  if (!typeof(IStep).IsAssignableFrom(t)) continue;
  Console.WriteLine(t.FullName + " implements " + typeof(IStep).FullName);
}

Если вы уже знаете название нужного типа, просто сделайте это

IStep step = (IStep)Activator.CreateInstance(Type.GetType("MyNamespace.MyType"));


  Сведения об ответе

pumpa

23:33, 10th August, 2020

Если реализация имеет конструктор без параметров, это можно сделать с помощью класса System.Activator. Вам нужно будет указать имя assembly в дополнение к имени класса:

IStep step = System.Activator.CreateInstance(sAssemblyName, sClassName).Unwrap() as IStep;

http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx


  Сведения об ответе

baggs

07:09, 3rd August, 2020

Основываясь на том, что другие указали, это то, что я закончил писать:

/// 
/// Some magic happens here: Find the correct action to take, by reflecting on types 
/// subclassed from IStep with that name.
/// 
private IStep GetStep(string sName)
{
    Assembly assembly = Assembly.GetAssembly(typeof (IStep));

    try
    {
        return (IStep) (from t in assembly.GetTypes()
                        where t.Name == sName && t.GetInterface("IStep") != null
                        select t
                        ).First().GetConstructor(new Type[] {}
                        ).Invoke(new object[] {});
    }
    catch (InvalidOperationException e)
    {
        throw new ArgumentException("Action not supported: " + sName, e);
    }
}


  Сведения об ответе

ASER

19:02, 12th August, 2020

Ну, похоже, что Assembly.CreateInstance - это правильный путь - единственная проблема с этим заключается в том, что ему нужно полное имя типа, т. е. включая пространство имен.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться