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

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

// использовать так:
Шаг IStep = GetStep (sName);
21.08.2008 11:49:08
4 ОТВЕТА
РЕШЕНИЕ

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

Если вы хотите найти типы, которые реализуют 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"));
8
21.08.2008 11:58:41

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

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

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

2
21.08.2008 12:39:30

Исходя из того, на что указали другие, я написал следующее:

/// 
/// Здесь происходит какая-то магия: найдите правильное действие, размышляя о типах 
/// подкласс от IStep с этим именем.
/// 
частный IStep GetStep (строка sName)
{
    Сборка сборки = Assembly.GetAssembly (typeof (IStep));

    пытаться
    {
        return (IStep) (из т в сборке. GetTypes ()
                        где t.Name == sName && t.GetInterface ("IStep")! = null
                        выберите т
                        ) .First (). GetConstructor (new Type [] {}
                        ) .Invoke (новый объект [] {});
    }
    catch (InvalidOperationException e)
    {
        выбросить новое ArgumentException («Действие не поддерживается:» + sName, e);
    }
}
1
1.03.2012 16:31:43

Похоже, что пошло бы Assembly.CreateInstance - единственная проблема в том, что ему нужно полное имя типа, то есть пространство имен.

0
21.08.2008 11:56:42