У меня есть интерфейс под названием IStep, который может выполнять некоторые вычисления (см. «Казнь в царстве существительных»). Во время выполнения я хочу выбрать подходящую реализацию по имени класса.
// use like this: IStep step = GetStep(sName);





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