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 и загружать их, поэтому у меня есть своя архитектура подключаемого модуля.