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

еще один способ получить именно результат, упомянутый в вопросе:

envtext= "printenv".execute().text
envtext.split('\n').each
{   envvar=it.split("=")
    println envvar[0]+" is "+envvar[1]
}

Это можно легко расширить, чтобы построить карту с подмножеством env vars, сопоставляющим критерии:

envdict=[:]
envtext= "printenv".execute().text
envtext.split('\n').each
{   envvar=it.split("=")
    if (envvar[0].startsWith("GERRIT_"))
        envdict.put(envvar[0],envvar[1])
}    
envdict.each{println it.key+" is "+it.value}
6
задан Daren Thomas 8 October 2010 в 07:22
поделиться

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
ответ дан 9 December 2019 в 22:42
поделиться

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

/// 
/// 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);
    }
}
1
ответ дан 9 December 2019 в 22:42
поделиться

Если реализация имеет конструктора без параметров, можно сделать это использование Системы. Класс активатора. Необходимо будет указать имя сборки в дополнение к имени класса:

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

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

2
ответ дан 9 December 2019 в 22:42
поделиться

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

0
ответ дан 9 December 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: