Тип.GetType ("пространство имен.a. b. ClassName") возвращает null



этот код:



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


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



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



using namespace.a.b;


обновление:



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

763   16  

16 ответов:

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

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

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

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

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

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

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

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

 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 ;
        }
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;
}

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

using System.Web.Compilation
...
BuildManager.GetType(typeName, false);

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

несмотря на это, typeof( T).FullName скажу вам, что вы должны сказать

EDIT: кстати, использование (как я уверен, вы знаете) - это только директивы компилятору во время компиляции и поэтому не может повлиять на успех вызова API. (Если у вас были ссылки на проект или сборку, это потенциально могло повлиять - Следовательно, информация не бесполезна, она просто требует некоторой фильтрации...)

Если ваш класс не находится в текущем assambly вы должны дать qualifiedName и этот код показывает, как получить qualifiedname класса

string qualifiedName = typeof(YourClass).AssemblyQualifiedName;

и тогда вы можете получить тип с qualifiedName

Type elementType = Type.GetType(qualifiedName);

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

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

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

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

typeof(namespace.a.b.ClassName)

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

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

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

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

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

Type obj = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).Where(t => String.Equals(t.Name, _viewModelName, StringComparison.Ordinal)).First();

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

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

Как это не будет работать

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

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

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

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

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

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

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

Type type = Type.GetType("PortalServices.PortalManagement+Merchant");

Как тип.GetType (String) нужны тип.AssemblyQualifiedName вы должны использовать сборка.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.

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

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

Comments

    Ничего не найдено.