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

Этот код:

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

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

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

using namespace.a.b;

Обновление:

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

Ответы [ 16 ]

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

Type.GetType("namespace.qualified.TypeName") работает только в том случае, если тип найден либо в mscorlib.dll, либо в текущей выполняемой сборке.

Если ни одна из этих вещей не соответствует действительности, вам понадобится имя с указанием сборки :

Type.GetType("namespace.qualified.TypeName, Assembly.Name")
168 голосов
/ 24 июня 2011

Вы также можете получить тип без имени сборки, но также с именем dll, например:

Type myClassType = Type.GetType("TypeName,DllName");

У меня была такая же ситуация, и она работала для меня. Мне нужен был объект типа «DataModel.QueueObject», и у меня была ссылка на «DataModel», поэтому я получил следующий тип:

Type type = Type.GetType("DataModel.QueueObject,DataModel");

Вторая строка после запятой - это имя ссылки (имя dll).

73 голосов
/ 04 августа 2012

попробуйте использовать этот метод

 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 ;
        }
24 голосов
/ 01 декабря 2009
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;
}
23 голосов
/ 05 декабря 2012

Если сборка является частью сборки приложения ASP.NET, вы можете использовать класс BuildManager:

using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
10 голосов
/ 21 марта 2017

, если ваш класс не в текущей сборке, вы должны указать qualName, и этот код показывает, как получить квалифицированное имя класса

.
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;

и тогда вы можете получить тип с квалифицированным именем

Type elementType = Type.GetType(qualifiedName);
8 голосов
/ 01 декабря 2009

Если это вложенный тип, вы можете забыть преобразовать. до +

Независимо от того, typeof( T).FullName скажет вам, что вы должны сказать

РЕДАКТИРОВАТЬ: КСТАТИ (как я уверен, вы знаете), являются только директивами для компилятора во время компиляции и, таким образом, не может повлиять на успех вызова API. (Если у вас есть ссылки на проект или сборку, это потенциально может оказать влияние - следовательно, информация не бесполезна, она просто требует некоторой фильтрации ...)

6 голосов
/ 18 мая 2014

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

Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))

Так что теперь можно использовать значение, возвращаемое в strType, чтобы создать экземпляр этого объекта.

4 голосов
/ 11 августа 2017

Когда у меня есть только имя класса, я использую это:

Type obj = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).Where(t => String.Equals(t.Name, _viewModelName, StringComparison.Ordinal)).First();
4 голосов
/ 13 апреля 2011

Попробуйте использовать полное имя типа, которое включает информацию о сборке, например:

string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);

У меня была такая же ситуация, когда я использовал только namesspace.classname, чтобы получить тип класса в другой сборке, и он не работал Работало, только когда я включил информацию о сборке в строку типа, как показано выше.

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