Questo codice:
Type.GetType("namespace.a.b.ClassName")
ritorna null
.
e ho negli usi:
using namespace.a.b;
Aggiornare:
Il tipo esiste, si trova in una libreria di classi diversa e ho bisogno di ottenerlo per nome di stringa.
Questo codice:
Type.GetType("namespace.a.b.ClassName")
ritorna null
.
e ho negli usi:
using namespace.a.b;
Aggiornare:
Il tipo esiste, si trova in una libreria di classi diversa e ho bisogno di ottenerlo per nome di stringa.
Risposte:
Type.GetType("namespace.qualified.TypeName")
funziona solo quando il tipo si trova in mscorlib.dll o nell'assembly attualmente in esecuzione.
Se nessuna di queste cose è vera, avrai bisogno di un nome qualificato dall'assembly :
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
Assembly a = Assembly.Load("SomeLibrary");
- e quindi caricare il tipo in base al nome dall'assembly - Type t = a.GetType("namespace.a.b.ClassName");
.
typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
risparmiare qualche problema, alla fine
È anche possibile ottenere il tipo senza nome completo dell'assembly ma anche con il nome dll, ad esempio:
Type myClassType = Type.GetType("TypeName,DllName");
Ho avuto la stessa situazione e ha funzionato per me. Avevo bisogno di un oggetto di tipo "DataModel.QueueObject" e avevo un riferimento a "DataModel", quindi ho ottenuto il tipo come segue:
Type type = Type.GetType("DataModel.QueueObject,DataModel");
La seconda stringa dopo la virgola è il nome di riferimento (nome dll).
NamespaceTypeName, AssemblyNameSpec
dove AssemblyNameSpec
è l'identificatore dell'assembly senza proprietà. Anche se questa risposta è essenzialmente lo stesso del accettato presumo che alcune persone preferiscono questo perché fa via con alcuni dei "rumore" che le proprietà di assemblaggio introducono (ad esempio Version
, Culture
PublicKeyToken
). Fortunatamente, le proprietà sono opzionali .
AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
prova a usare questo metodo
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
non è supportato. Non sono sicuro di eventuali alternative.
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
del tipo generico viene rimosso.
Se l'assembly fa parte della build di un'applicazione ASP.NET, è possibile utilizzare la classe BuildManager:
using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
se la tua classe non è nell'assembly corrente devi dare qualificatoNome e questo codice mostra come ottenere il nome qualificato della classe
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
e quindi puoi ottenere il tipo con qualificatoNome
Type elementType = Type.GetType(qualifiedName);
Se è un tipo annidato, potresti dimenticare di trasformare un file. a un +
Indipendentemente da ciò, typeof( T).FullName
ti dirò cosa dovresti dire
EDIT: BTW gli utilizzi (come sono sicuro che tu sappia) sono solo direttive per il compilatore in fase di compilazione e non possono quindi avere alcun impatto sul successo della chiamata API. (Se avessi riferimenti a progetti o assembly, ciò potrebbe potenzialmente avere influenza - quindi le informazioni non sono inutili, ci vuole solo un po 'di filtraggio ...)
+
separatore)
Poiché Type.GetType (String) necessita di Type.AssemblyQualifiedName , dovresti usare 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);
Version, Culture e PublicKeyToken non sono necessari per assemblyName
questo motivo è possibile utilizzare MyAssembly.GetName (). Name.
Informazioni su Type.GetType (String) :
Se il tipo si trova nell'assembly attualmente in esecuzione o in Mscorlib.dll, è sufficiente fornire il nome del tipo qualificato dal suo spazio dei nomi.
Sto aprendo i controlli utente a seconda dei controlli utente a cui l'utente ha accesso specificato in un database. Quindi ho usato questo metodo per ottenere TypeName ...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
Quindi ora è possibile utilizzare il valore restituito in strType per creare un'istanza di quell'oggetto.
Se si fa riferimento all'assembly e la classe è visibile:
typeof(namespace.a.b.ClassName)
GetType restituisce null perché il tipo non viene trovato, con typeof, il compilatore può aiutarti a scoprire l'errore.
Prova a utilizzare il nome completo del tipo che include le informazioni sull'assembly, ad esempio:
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
Ho avuto la stessa situazione quando stavo usando solo namesspace.classname per ottenere il tipo di una classe in un assembly diverso e non funzionava. Ha funzionato solo quando ho incluso le informazioni sull'assembly nella mia stringa di tipo come mostrato sopra.
Per me, un "+" era la chiave! Questa è la mia classe (è annidata):
namespace PortalServices
{
public class PortalManagement : WebService
{
public class Merchant
{}
}
}
e questa riga di codice ha funzionato:
Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
Questa soluzione sopra sembra essere la migliore per me, ma non ha funzionato per me, quindi l'ho fatto come segue:
AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);
Type myType = Type.GetType(typeAssemblyQualifiedName);
Il presupposto è che tu conosca il percorso dell'assemblea. Nel mio caso lo so perché questo è un assembly costruito da un altro progetto interno ed è incluso nella cartella bin del nostro progetto.
Nel caso in cui sia importante sto usando Visual Studio 2013, il mio target .NET è 4.0. Questo è un progetto ASP.NET, quindi ottengo il percorso assoluto tramite HttpContext
. Tuttavia, il percorso assoluto non è un requisito come sembra da MSDN su AssemblyQualifiedNames
Ho barato. Poiché i tipi che voglio creare (per nome) sono tutti in una dll che controllo, ho semplicemente inserito un metodo statico nella dll nell'assembly che prende un nome semplice e chiama type.GetType da quel contesto e restituisce il risultato .
Lo scopo originale era che il tipo potesse essere specificato per nome nei dati di configurazione. Da allora ho cambiato il codice in modo che l'utente specificasse un formato da elaborare. Le classi del gestore del formato implementano un'interfaccia che determina se il tipo può analizzare il formato specificato. Quindi uso la reflection per trovare i tipi che implementano l'interfaccia e ne trovo uno che gestisce il formato. Quindi ora la configurazione specifica un nome di formato, non un tipo specifico. Il codice di riflessione può guardare le DLL adiacenti e caricarle, quindi ho un'architettura plug-in di tipo povero.