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