Цей код:
Type.GetType("namespace.a.b.ClassName")
повертає null
.
і я маю в узінгах:
using namespace.a.b;
Оновлення:
Тип існує, він знаходиться в бібліотеці іншого класу, і мені потрібно отримати його за назвою рядка.
Цей код:
Type.GetType("namespace.a.b.ClassName")
повертає null
.
і я маю в узінгах:
using namespace.a.b;
Оновлення:
Тип існує, він знаходиться в бібліотеці іншого класу, і мені потрібно отримати його за назвою рядка.
Відповіді:
Type.GetType("namespace.qualified.TypeName")
працює лише тоді, коли тип знайдений або в mscorlib.dll, або в даний час виконується збірка.
Якщо жодне з цих речей не відповідає дійсності, вам знадобиться ім'я, призначене для складання :
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
Assembly a = Assembly.Load("SomeLibrary");
- і потім завантажити тип за назвою з збірки - Type t = a.GetType("namespace.a.b.ClassName");
.
typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
врятувати клопоту, зрештою
Ви також можете отримати тип без кваліфікованого імені, але також з іменем dll, наприклад:
Type myClassType = Type.GetType("TypeName,DllName");
У мене була така ж ситуація, і це працювало на мене. Мені знадобився об’єкт типу "DataModel.QueueObject" і мав посилання на "DataModel", тому я отримав тип таким чином:
Type type = Type.GetType("DataModel.QueueObject,DataModel");
Другий рядок після коми - це посилання (ім'я dll).
NamespaceTypeName, AssemblyNameSpec
де AssemblyNameSpec
ідентифікатор збірки без будь-яких властивостей. Незважаючи на те, що ця відповідь по суті є такою ж, як і прийнята, я вважаю, що деякі люди віддають перевагу цьому, оскільки це усуває певний "шум", який вносяться властивості складання (наприклад Version
, Culture
PublicKeyToken
). На щастя, властивості необов’язкові .
AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
спробуйте скористатися цим методом
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 ;
}
AppDomain
не підтримується. Не впевнений у будь-яких альтернативах.
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;
}
T
загальний тип знімається.
Якщо збірка є частиною збірки програми ASP.NET, ви можете використовувати клас BuildManager:
using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
якщо ваш клас не є поточним, можливо, ви повинні надати кваліфіковане ім'я, і цей код показує, як отримати кваліфіковане ім'я класу
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
і тоді ви можете набрати тип кваліфікованого імені
Type elementType = Type.GetType(qualifiedName);
Якщо це вкладений тип, можливо, ви забудете перетворити a. до +
Незалежно, typeof( T).FullName
підкаже, що вам слід сказати
РЕДАКТУВАННЯ: До речі, ушивки (як я впевнений, ви знаєте) - це лише директиви для компілятора під час компіляції, і таким чином не можуть впливати на успіх виклику API. (Якщо у вас були посилання на проект чи збірку, це потенційно могло б вплинути - отже, інформація є марною, вона просто потребує деякої фільтрації ...)
+
роздільник)
Я відкриваю керування користувачами залежно від того, який користувач контролює, користувач має доступ до вказаних у базі даних. Тому я використав цей метод, щоб отримати TypeName ...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
Отже, тепер можна використовувати значення, повернене в strType, для створення примірника цього об'єкта.
Як 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);
Версія, культура та PublicKeyToken не потрібні assemblyName
, тому ви можете використовувати MyAssembly.GetName ().
Про Type.GetType (String) :
Якщо тип знаходиться у виконаній в даний час збірці або в Mscorlib.dll, достатньо вказати ім'я типу, кваліфіковане за його простором імен.
Якщо збірка посилається і Клас видимий:
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);
У мене була така ж ситуація, коли я використовував тільки ім'я namesspace.class, щоб отримати тип класу в іншій збірці, і це не працюватиме. Працює лише тоді, коли я включив інформацію про збірку в рядок типу, як показано вище.
Для мене ключовим було "+"! Це мій клас (це вкладений):
namespace PortalServices
{
public class PortalManagement : WebService
{
public class Merchant
{}
}
}
і цей рядок коду працював:
Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
Це рішення, здається, найкраще для мене, але воно не спрацювало для мене, тому я зробив це так:
AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);
Type myType = Type.GetType(typeAssemblyQualifiedName);
Передумовою є те, що ви знаєте шлях складання. У моєму випадку я це знаю, тому що це збірка, побудована з іншого внутрішнього проекту та включена до папки бін нашого проекту.
У випадку, якщо це має значення, я використовую Visual Studio 2013, цільовим .NET є 4.0. Це проект ASP.NET, тому я отримую абсолютний шлях через HttpContext
. Однак абсолютний шлях не є вимогою, як це здається з MSDN на AssemblyQualifiedNames
Я обдурив. Оскільки типи, які я хочу створити (по імені), знаходяться в контролі dll, я просто поміщаю статичний метод у dll в зборі, який приймає просте ім’я, і виклику type.GetType з цього контексту і повертає результат .
Початкова мета полягала в тому, щоб тип міг бути вказаний іменем у даних конфігурації. З тих пір я змінив код, щоб користувач вказав формат для обробки. Класи обробників форматів реалізують інтерфейс, який визначає, чи може тип розбору заданого формату. Потім я використовую відображення для пошуку типів, що реалізують інтерфейс, і знаходжу такий, який обробляє формат. Тож тепер конфігурація вказує назву формату, а не конкретний тип. Код відображення може переглядати сусідні клітини та завантажувати їх, тож у мене є своєрідна архітектура плагінів для бідних людей.