Ten kod:
Type.GetType("namespace.a.b.ClassName")
zwraca null
.
i mam w użyciu:
using namespace.a.b;
Aktualizacja:
Ten typ istnieje, jest w innej bibliotece klas i muszę go zdobyć po nazwie łańcucha.
Ten kod:
Type.GetType("namespace.a.b.ClassName")
zwraca null
.
i mam w użyciu:
using namespace.a.b;
Aktualizacja:
Ten typ istnieje, jest w innej bibliotece klas i muszę go zdobyć po nazwie łańcucha.
Odpowiedzi:
Type.GetType("namespace.qualified.TypeName")
działa tylko wtedy, gdy typ zostanie znaleziony w pliku mscorlib.dll lub aktualnie wykonywanym zestawie.
Jeśli żadna z tych rzeczy nie jest prawdą, potrzebujesz nazwy kwalifikującej się do złożenia :
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
Assembly a = Assembly.Load("SomeLibrary");
- a następnie załadować typ według nazwy z zestawu - Type t = a.GetType("namespace.a.b.ClassName");
.
typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
zaoszczędzić trochę kłopotów, w końcu
Możesz także uzyskać typ bez nazwy kwalifikowanej dla zestawu, ale z nazwą dll również, na przykład:
Type myClassType = Type.GetType("TypeName,DllName");
Miałem tę samą sytuację i zadziałało to dla mnie. Potrzebowałem obiektu typu „DataModel.QueueObject” i miałem odniesienie do „DataModel”, więc otrzymałem ten typ w następujący sposób:
Type type = Type.GetType("DataModel.QueueObject,DataModel");
Drugi ciąg po przecinku to nazwa odwołania (nazwa dll).
NamespaceTypeName, AssemblyNameSpec
gdzie AssemblyNameSpec
jest identyfikator zestawu bez żadnych właściwości. Nawet jeśli ta odpowiedź jest w zasadzie taka sama jak przyjęta Przypuszczam, że niektórzy ludzie wolą to dlatego, że eliminuje niektóre z „szumu”, że właściwości montażowych wprowadzenia (np Version
, Culture
PublicKeyToken
). Na szczęście właściwości są opcjonalne .
AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
spróbuj użyć tej metody
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
nie jest obsługiwany. Nie jestem pewien żadnych alternatyw.
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
typ ogólny jest pozbawiony.
Jeśli zestaw jest częścią kompilacji aplikacji ASP.NET, możesz użyć klasy BuildManager:
using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
jeśli twojej klasy nie ma w obecnym zespole, musisz podać kwalifikowaną nazwę, a ten kod pokazuje, jak uzyskać kwalifikowaną nazwę klasy
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
i wtedy możesz uzyskać typ z kwalifikowaną nazwą
Type elementType = Type.GetType(qualifiedName);
Jeśli jest to typ zagnieżdżony, być może zapominasz o przekształceniu. do +
Bez względu, typeof( T).FullName
powiem ci, co powinieneś powiedzieć
EDYCJA: BTW, zastosowania (jak jestem pewien, że wiesz) są tylko dyrektywami kompilatora w czasie kompilacji i dlatego nie mogą mieć żadnego wpływu na powodzenie wywołania API. (Jeśli miałeś odniesienia do projektu lub zestawu, które mogłyby potencjalnie mieć wpływ - dlatego informacja nie jest bezużyteczna, wystarczy tylko trochę filtrowania ...)
+
separatora)
Otwieram kontrolki użytkownika w zależności od tego, które kontrolki użytkownik ma dostęp do określonych w bazie danych. Więc użyłem tej metody, aby uzyskać TypeName ...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
Teraz można użyć wartości zwróconej w strType, aby utworzyć instancję tego obiektu.
Ponieważ Type.GetType (String) potrzebuje Type.AssemblyQualifiedName , powinieneś użyć 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);
Wersja, kultura i klucz publiczny nie są wymagane assemblyName
, dlatego możesz użyć MyAssembly.GetName (). Name.
Informacje o Type.GetType (String) :
Jeśli typ znajduje się w aktualnie wykonywanym zestawie lub w Mscorlib.dll, wystarczy podać nazwę typu kwalifikowaną przez jego przestrzeń nazw.
Spróbuj użyć pełnej nazwy typu, która zawiera informacje o zestawie, na przykład:
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
Miałem taką samą sytuację, gdy korzystałem tylko z nazwy namesspace.class, aby uzyskać typ klasy w innym zestawie i to nie działałoby. Działa tylko wtedy, gdy dołączam informacje o złożeniu do mojego ciągu typu, jak pokazano powyżej.
Dla mnie kluczem był „+”! To jest moja klasa (jest to zagnieżdżona):
namespace PortalServices
{
public class PortalManagement : WebService
{
public class Merchant
{}
}
}
i ta linia kodu działała:
Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
Powyższe rozwiązanie wydaje mi się najlepsze, ale dla mnie nie zadziałało, więc zrobiłem to w następujący sposób:
AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);
Type myType = Type.GetType(typeAssemblyQualifiedName);
Warunkiem jest znajomość ścieżki zgromadzenia. W moim przypadku wiem o tym, ponieważ jest to zestaw zbudowany z innego projektu wewnętrznego i jest zawarty w folderze bin naszego projektu.
W przypadku, gdy ma to znaczenie, używam Visual Studio 2013, mój docelowy .NET to 4.0. To projekt ASP.NET, więc otrzymuję ścieżkę bezwzględną HttpContext
. Jednak ścieżka bezwzględna nie jest wymagana, jak się wydaje z MSDN na AssemblyQualifiedNames
Oszukiwałem. Ponieważ wszystkie typy, które chcę utworzyć (według nazwy), znajdują się w kontrolowanej przeze mnie bibliotece DLL, po prostu umieściłem metodę statyczną w bibliotece DLL w zestawie, która przyjmuje prostą nazwę i wywołuje typ.GetType z tego kontekstu i zwraca wynik .
Pierwotny cel polegał na tym, że typ można określić według nazwy w danych konfiguracyjnych. Od tego czasu zmieniłem kod, aby użytkownik określił format do przetworzenia. Klasy procedur obsługi formatu implementują interfejs, który określa, czy typ może przeanalizować określony format. Następnie używam refleksji, aby znaleźć typy implementujące interfejs i znaleźć taki, który obsługuje format. Więc teraz konfiguracja określa nazwę formatu, a nie określonego typu. Kod odbicia może patrzeć na sąsiadujące biblioteki DLL i ładować je, więc mam architekturę wtyczki biednego człowieka.