У меня есть интерфейс, IStep
который может выполнять некоторые вычисления (см. « Выполнение в царстве существительных »). Во время выполнения я хочу выбрать соответствующую реализацию по имени класса.
// использовать так: Шаг IStep = GetStep (sName);
Ваш вопрос очень запутанный ...
Если вы хотите найти типы, которые реализуют 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"));
Если реализация имеет конструктор без параметров, вы можете сделать это с помощью класса System.Activator. Вам нужно будет указать имя сборки в дополнение к имени класса:
IStep step = System.Activator.CreateInstance(sAssemblyName, sClassName).Unwrap() as IStep;
http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx
Исходя из того, на что указали другие, я написал следующее:
/// /// Здесь происходит какая-то магия: найдите правильное действие, размышляя о типах /// подкласс от 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); } }
Похоже, что пошло бы Assembly.CreateInstance - единственная проблема в том, что ему нужно полное имя типа, то есть пространство имен.