Простой пример:
namespace Your.Namespace
{
public class Foo
{
public DateTime SixtyDaysFromNow()
{
return DateTime.Now + new TimeSpan(60,0,0,0);
}
}
public class CreateInstance1
{
public static void Main(string[] args)
{
try
{
var x = Activator.CreateInstance(null, "Your.Namespace.Foo");
Foo f = (Foo) x.Unwrap();
Console.WriteLine("Result: {0}", f.SixtyDaysFromNow().ToString("G"));
}
catch (System.Exception exc1)
{
Console.WriteLine("Exception: {0}", exc1.ToString());
}
}
}
}
Вызовите Activator.CreateInstance()
, указав имя сборки и имя класса. Имя класса должно быть полностью квалифицированным (включая все пространства имен). Если имя сборки равно NULL, то используется текущая сборка. Если класс, который вы хотите активировать, находится за пределами текущей запущенной сборки, вам необходимо указать сборку с полным именем.
Чтобы загрузить из другой сборки, вам нужно использовать перегрузку для CreateInstance
, которая принимает тип, а не имя типа; Один из способов получить тип для заданного имени типа - это использовать Type.GetType()
, указав имя с указанием сборки.
Чаще всего Activator.CreateInstance()
выполняется с использованием типов интерфейса, так что созданный экземпляр может быть приведен к интерфейсу, и вы можете вызывать его по типу интерфейса. как это:
interface ISixty
{
DateTime SixtyDaysFromNow();
}
public class Foo : ISixty
{
public DateTime SixtyDaysFromNow()
{
return DateTime.Now + new TimeSpan(60,0,0,0);
}
}
и
var x = Activator.CreateInstance(null, "Your.Namespace.Foo");
ISixty f = (ISixty) x.Unwrap();
Console.WriteLine("Sixty days from now: {0}", f.SixtyDaysFromNow().ToString("G"));
Делая это таким образом, ваше приложение (активирующее приложение) не должно знать или явно ссылаться на другую сборку во время компиляции.