Как загрузить тип из имени типа и имени сборки - PullRequest
6 голосов
/ 21 ноября 2011

Мне нужно получить экземпляр типа, чье имя и имя сборки я буду иметь во время выполнения.Я заранее знаю, что тип будет иметь конструктор без параметров.Какой самый простой способ сделать это?

Это намного сложнее, чем я надеялся.

Редактировать: Я не согласен, если это важно, но на сборку будут ссылаться.Мне не нужно загружать его с диска или чего-то еще.

Ответы [ 7 ]

6 голосов
/ 21 ноября 2011
5 голосов
/ 21 ноября 2011

С MSDN :

Activator.CreateInstance Method (String, String)

Создает экземпляр типа, имя которого указано, используя именованную сборку и конструктор по умолчанию.

public static ObjectHandle CreateInstance(
  string assemblyName,
  string typeName
)

Пример:

var assemblyName =
    "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";

var typeName = "System.Net.WebClient";

var instance = Activator.CreateInstance(assemblyName, typeName).Unwrap();
3 голосов
/ 21 ноября 2011

Если ссылка на System.Web.dll не является для вас проблемой, существует малоизвестный метод BuildManager.GetType , который достаточно эффективен.Ему даже не требуется имя сборки, поскольку он ищет типы в сборках в текущем пути выполнения AppDomain.

Таким образом, код будет:

object instance = Activator.CreateInstance(BuildManager.GetType("MyNamespace.MyClass", true));
2 голосов
/ 21 ноября 2011
Activator.CreateInstance(Type.GetType("System.Int32"));

Активатор

Тип

2 голосов
/ 21 ноября 2011
Type referencedType = typeof(AReferencedType);
AReferencedType instance = Activator.CreateInstance<AReferencedType>();

or 

Type type = Type.GetType("Type's full name");
object instance = Activator.CreateInstance(type);
2 голосов
/ 21 ноября 2011

Должно быть достаточно:

var assmebly = Assembly.Load("FullyQualifiedAssemblyName");
var type = assmebly.GetType("FullTypeName");
var instance = Activator.CreateInstance(type);
1 голос
/ 22 ноября 2011

Вот что работает, используя причудливое ключевое слово dynamic.Вам нужно будет сослаться на другой класс для прохождения теста или использовать событие сборки для копирования встроенной DLL.

namespace TestLibrary
{
    [TestFixture]
    public class Tests
    {
        [Test]
        public void FileCheck()
        {
            dynamic otherClass = 
                AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap("OtherLibrary.dll",                
                    "Prefix.OtherLibrary.SomeClass");
            otherClass.SayHello();   // look, ma! no casting or interfaces!
        }
    }
}

namespace Prefix.OtherLibrary
{
    public class SomeClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello, world.");
        }
    }
}

В отличие от Activator, AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap принимает имя файла в качестве первого аргумента, а не спецификатора типа.Это иногда полезно, особенно когда вас не интересует строгое название сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...