Type.GetType( "namespace.a.b.ClassName" ) возвращает null
Этот код:
Type.GetType("namespace.a.b.ClassName")
возвращает null
.
и у меня есть в использовании:
using namespace.a.b;
Update:
Тип существует, он в другой библиотеке классов, и мне нужно получить его по имени строки.
Ответы
Ответ 1
Type.GetType("namespace.qualified.TypeName")
работает только в том случае, если тип найден либо в mscorlib.dll, либо в текущей выполняемой сборке.
Если ни одно из этих утверждений не является правдой, вам понадобится полное имя сборки:
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
Ответ 2
Вы также можете получить тип без квалифицированного имени сборки, но также с именем dll, например:
Type myClassType = Type.GetType("TypeName,DllName");
У меня была такая же ситуация, и это сработало для меня. Мне нужен объект типа "DataModel.QueueObject" и имел ссылку на "DataModel", поэтому я получил следующий тип:
Type type = Type.GetType("DataModel.QueueObject,DataModel");
Вторая строка после запятой - это имя ссылки (имя dll).
Ответ 3
попробуйте использовать этот метод
public static Type GetType(string typeName)
{
var type = Type.GetType(typeName);
if (type != null) return type;
foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
{
type = a.GetType(typeName);
if (type != null)
return type;
}
return null ;
}
Ответ 4
Dictionary<string, Type> typeCache;
...
public static bool TryFindType(string typeName, out Type t) {
lock (typeCache) {
if (!typeCache.TryGetValue(typeName, out t)) {
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) {
t = a.GetType(typeName);
if (t != null)
break;
}
typeCache[typeName] = t; // perhaps null
}
}
return t != null;
}
Ответ 5
Если сборка является частью сборки приложения ASP.NET, вы можете использовать класс BuildManager:
using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
Ответ 6
Если ваш класс не находится в текущем состоянии, вы должны дать квалифицированное имя, и этот код показывает, как получить квалифицированное имя класса
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
а затем вы можете получить тип с квалифицированным именем
Type elementType = Type.GetType(qualifiedName);
Ответ 7
Если это вложенный тип, вы можете забыть преобразовать a. на +
Независимо, typeof( T).FullName
расскажет вам, что вы должны сказать
РЕДАКТИРОВАТЬ: BTW, которые используются (как я уверен, вы знаете), являются только директивами для компилятора во время компиляции и, таким образом, не могут повлиять на успех вызова API. (Если у вас были ссылки на проекты или сборки, которые потенциально могли иметь влияние - следовательно, информация не бесполезна, просто требуется фильтрация...)
Ответ 8
Я открываю пользовательские элементы управления в зависимости от того, какой пользователь контролирует доступ пользователя к указанному в базе данных. Поэтому я использовал этот метод для получения TypeName...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
Итак, теперь можно использовать значение, возвращаемое в strType, чтобы создать экземпляр этого объекта.
Ответ 9
Когда у меня есть только имя класса, я использую это:
Type obj = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).Where(t => String.Equals(t.Name, _viewModelName, StringComparison.Ordinal)).First();
Ответ 10
Если ссылка на сборку и класс видимый:
typeof(namespace.a.b.ClassName)
GetType возвращает null, потому что тип не найден, с typeof, компилятор может помочь вам узнать об ошибке.
Ответ 11
Попробуйте использовать полное имя типа, которое содержит информацию о сборке, например:
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
У меня была такая же ситуация, когда я использовал только имя namesspace.classname, чтобы получить тип класса в другой сборке, и это не сработает. Работал только тогда, когда я включил информацию о сборке в свою строку типа, как показано выше.
Ответ 12
Убедитесь, что запятая находится непосредственно после полного имени
typeof(namespace.a.b.ClassName, AssemblyName)
Поскольку это не работает
typeof(namespace.a.b.ClassName ,AssemblyName)
Я был в тупике несколько дней на этом
Ответ 13
Поскольку 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, требуется только имя без Version, Culture и PublicKeyToken.
Ответ 14
Это вышеописанное выше решение кажется лучшим для меня, но для меня это не сработало, поэтому я сделал это следующим образом:
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
Ответ 15
Для меня ключом "+" был ключ!
Это мой класс (это вложенный):
namespace PortalServices
{
public class PortalManagement : WebService
{
public class Merchant
{}
}
}
и эта строка кода работала:
Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
Ответ 16
Я обманул. Поскольку типы, которые я хочу создать (по имени), все находятся во В dll, который я контролирую, я просто ставил статический метод в DLL в сборке, который принимает простое имя, и вызывает type.GetType из этого контекста и возвращает результат.
Первоначальная цель состояла в том, чтобы тип мог быть указан по имени в данных конфигурации. С тех пор я изменил код, чтобы пользователь указал формат для обработки. Классы обработчика формата реализуют интерфейс, который определяет, может ли тип анализировать указанный формат. Затем я использую отражение, чтобы найти типы, реализующие интерфейс, и найти тот, который обрабатывает формат. Итак, теперь в конфигурации указано имя формата, а не определенный тип. Код отражения может смотреть на соседние DLL и загружать их, поэтому у меня есть своя архитектура подключаемого модуля.