Этот код:
Type.GetType("namespace.a.b.ClassName")
возвращается null
.
и я имею в употреблениях:
using namespace.a.b;
Обновить:
Тип существует, он находится в другой библиотеке классов, и мне нужно получить его по строковому имени.
c#
reflection
Ома
источник
источник
Ответы:
Type.GetType("namespace.qualified.TypeName")
работает только тогда, когда тип найден либо в mscorlib.dll, либо в текущей выполняемой сборке.Если ни одна из этих вещей не соответствует действительности, вам понадобится имя, дополненное сборкой :
источник
Assembly a = Assembly.Load("SomeLibrary");
-, а затем загрузить тип по имени из сборки -Type t = a.GetType("namespace.a.b.ClassName");
.typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
возможно, сэкономить некоторые хлопоты, в конце концовВы также можете получить тип без имени сборки, но также с именем dll, например:
У меня была такая же ситуация, и она работала на меня. Мне нужен был объект типа «DataModel.QueueObject» и имел ссылку на «DataModel», поэтому я получил тип следующим образом:
Вторая строка после запятой - это имя ссылки (имя dll).
источник
NamespaceTypeName, AssemblyNameSpec
гдеAssemblyNameSpec
идентификатор сборки без каких-либо свойств. Хотя этот ответ по сути такой же, как принятый, я предполагаю, что некоторые люди предпочитают это, потому что он устраняет некоторые «шумы», которые вносят свойства сборки (напримерVersion
,Culture
PublicKeyToken
). К счастью, свойства не являются обязательными .AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
попробуйте использовать этот метод
источник
AppDomain
не поддерживается. Не уверен ни в каких альтернативах.источник
T
универсальный тип удален.Если сборка является частью сборки приложения ASP.NET, вы можете использовать класс BuildManager:
источник
если ваш класс не находится в текущей сборке, вы должны дать qualName, и этот код показывает, как получить квалифицированное имя класса
и тогда вы можете получить тип с qualName
источник
Если это вложенный тип, вы можете забыть преобразовать. к +
Несмотря на,
typeof( T).FullName
скажу вам, что вы должны сказатьРЕДАКТИРОВАТЬ: Кстати, использование (как я уверен, вы знаете) являются только директивами для компилятора во время компиляции и, таким образом, не может иметь никакого влияния на успех вызова API. (Если у вас есть ссылки на проект или сборку, это потенциально может оказать влияние - следовательно, информация не бесполезна, она просто требует некоторой фильтрации ...)
источник
+
разделитель)Я открываю пользовательские элементы управления в зависимости от того, какие пользовательские элементы управления имеют доступ к пользователю, указанному в базе данных. Поэтому я использовал этот метод, чтобы получить TypeName ...
Так что теперь можно использовать значение, возвращаемое в strType, чтобы создать экземпляр этого объекта.
источник
Когда у меня есть только имя класса, я использую это:
источник
Поскольку Type.GetType (String) требуется Type.AssemblyQualifiedName, вы должны использовать Assembly.CreateQualifiedName (String, String) .
Version, Culture и PublicKeyToken не требуются
assemblyName
, поэтому вы можете использовать MyAssembly.GetName (). Name.О Type.GetType (String) :
источник
Если на сборку ссылаются и класс виден:
GetType возвращает null, потому что тип не найден, с помощью typeof компилятор может помочь вам обнаружить ошибку.
источник
Попробуйте использовать полное имя типа, которое включает информацию о сборке, например:
У меня была такая же ситуация, когда я использовал только namesspace.classname, чтобы получить тип класса в другой сборке, и это не сработало. Работал только тогда, когда я включил информацию о сборке в строку типа, как показано выше.
источник
Убедитесь, что запятая находится сразу после полного имени
Как это не получится
Я был в тупике на несколько дней на этом
источник
Для меня «+» был ключом! Это мой класс (он вложенный):
и эта строка кода работает:
источник
Это решение, представленное выше, кажется мне лучшим, но оно не сработало для меня, поэтому я сделал это следующим образом:
Предварительным условием является то, что вы знаете путь сборки. В моем случае я знаю это, потому что это сборка, созданная из другого внутреннего проекта и включенная в папку bin нашего проекта.
На случай, если я использую Visual Studio 2013, моя цель .NET - 4.0. Это проект ASP.NET, поэтому я получаю абсолютный путь через
HttpContext
. Однако абсолютный путь не является обязательным, как это видно из MSDN на AssemblyQualifiedNamesисточник
Я обманул. Поскольку все типы, которые я хочу создать (по имени), находятся в элементе управления dll, я просто помещаю в сборку статический метод в сборке, который принимает простое имя и вызывает type.GetType из этого контекста и возвращает результат. ,
Первоначальная цель состояла в том, чтобы тип мог быть указан по имени в данных конфигурации. С тех пор я изменил код, чтобы пользователь указал формат для обработки. Классы обработчика формата реализуют интерфейс, который определяет, может ли тип анализировать указанный формат. Затем я использую отражение, чтобы найти типы, которые реализуют интерфейс, и найти тот, который обрабатывает формат. Так что теперь конфигурация задает имя формата, а не определенный тип. Код отражения может смотреть на соседние библиотеки и загружать их, поэтому у меня есть своего рода архитектура подключаемого модуля для бедного человека.
источник