Type.GetType ("namespace.a.b.ClassName") возвращает ноль - PullRequest
192 голосов
/ 01 декабря 2009

Этот код:

Type.GetType("namespace.a.b.ClassName")

возвращает null.

а у меня в употреблениях:

using namespace.a.b;

Обновление:

Тип существует, он находится в другой библиотеке классов, и мне нужно получить его по строковому имени.

Ответы [ 16 ]

4 голосов
/ 01 декабря 2009

Если на сборку ссылаются и класс виден:

typeof(namespace.a.b.ClassName)

GetType возвращает null, поскольку тип не найден, с помощью typeof компилятор может помочь вам обнаружить ошибку.

3 голосов
/ 24 марта 2017

Убедитесь, что запятая идет сразу после полного имени

typeof(namespace.a.b.ClassName, AssemblyName)

Как это не сработает

typeof(namespace.a.b.ClassName ,AssemblyName)

Я был в тупике на несколько дней на этом

2 голосов
/ 14 мая 2018

Как Type.GetType (String) необходимо Type.AssemblyQualifiedName , вы должны использовать Assembly.CreateQualifiedName (String, String) .

string typeName = "MyNamespace.MyClass"; // Type.FullName
string assemblyName = "MyAssemblyName"; // MyAssembly.FullName or MyAssembly.GetName().Name
string assemblyQualifiedName = Assembly.CreateQualifiedName(assemblyName , typeName);
Type myClassType = Type.GetType(assemblyQualifiedName);

В качестве AssemblyName вам не нужно FullName, требуется только имя без версии, культуры и PublicKeyToken.

1 голос
/ 16 октября 2017

Для меня «+» был ключом! Это мой класс (он вложенный):

namespace PortalServices
{
public class PortalManagement : WebService
{
    public class Merchant
    {}
}
}

и эта строка кода сработала:

Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
1 голос
/ 27 ноября 2015

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

AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);

Type myType = Type.GetType(typeAssemblyQualifiedName);

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

На случай, если я использую Visual Studio 2013, моя цель .NET - 4.0. Это проект ASP.NET, поэтому я получаю абсолютный путь через HttpContext. Тем не менее, абсолютный путь не является обязательным, как это видно из MSDN на AssemblyQualifiedNames

0 голосов
/ 15 июня 2016

Я обманул. Поскольку все типы, которые я хочу создать (по имени), находятся в элементе управления dll, я просто помещаю в сборку статический метод в сборке, который принимает простое имя и вызывает type.GetType из этого контекста и возвращает результат. .

Первоначальная цель состояла в том, чтобы тип мог быть указан по имени в данных конфигурации. С тех пор я изменил код, чтобы пользователь указал формат для обработки. Классы обработчика формата реализуют интерфейс, который определяет, может ли тип анализировать указанный формат. Затем я использую отражение, чтобы найти типы, которые реализуют интерфейс, и найти тот, который обрабатывает формат. Так что теперь конфигурация задает имя формата, а не определенный тип. Код отражения может просматривать смежные библиотеки и загружать их, поэтому у меня есть своего рода архитектура подключаемого модуля для бедного человека.

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