Ce code:
Type.GetType("namespace.a.b.ClassName")
renvoie null
.
et j'ai dans les usings:
using namespace.a.b;
Mise à jour:
Le type existe, il se trouve dans une bibliothèque de classes différente et j'ai besoin de l'obtenir par nom de chaîne.
Type.GetType("namespace.qualified.TypeName")
ne fonctionne que lorsque le type est trouvé dans mscorlib.dll ou dans l'assembly en cours d'exécution.
Si aucune de ces choses n'est vraie, vous aurez besoin d'un nom qualifié d'assemblage :
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
Vous pouvez également obtenir le type sans nom qualifié d'assembly mais avec le nom de la dll également, par exemple:
Type myClassType = Type.GetType("TypeName,DllName");
J'ai eu la même situation et cela a fonctionné pour moi. J'avais besoin d'un objet de type "DataModel.QueueObject" et j'avais une référence à "DataModel". J'ai donc obtenu le type comme suit:
Type type = Type.GetType("DataModel.QueueObject,DataModel");
La deuxième chaîne après la virgule est le nom de référence (nom de la DLL).
essayez d'utiliser cette méthode
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 ;
}
Si l'assembly fait partie de la construction d'une application ASP.NET, vous pouvez utiliser la classe BuildManager:
using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
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;
}
si votre classe n'est pas dans l'assambly en cours, vous devez donner qualifiéName et ce code montre comment obtenir un nom qualifié de la classe
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
et alors vous pouvez obtenir le type avec QualifiedName
Type elementType = Type.GetType(qualifiedName);
S'il s'agit d'un type imbriqué, vous pourriez oublier de transformer un fichier. à un +
Quoi qu'il en soit, typeof( T).FullName
vous dira ce que vous devriez dire
EDIT: BTW les utilisations (comme vous le savez sûrement) ne sont que des directives données au compilateur au moment de la compilation et ne peuvent donc avoir aucune incidence sur le succès de l'appel de l'API. (Si vous aviez des références de projet ou d'assemblage, cela aurait potentiellement pu avoir une influence - l'information n'est donc pas inutile, il faut juste filtrer ...)
Quand je n'ai que le nom de la classe, j'utilise ceci:
Type obj = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).Where(t => String.Equals(t.Name, _viewModelName, StringComparison.Ordinal)).First();
J'ouvre les contrôles utilisateur en fonction des contrôles utilisateur auxquels l'utilisateur a accès spécifié dans une base de données. J'ai donc utilisé cette méthode pour obtenir le TypeName ...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
Alors maintenant, on peut utiliser la valeur retournée dans strType pour créer une instance de cet objet.
Si l'assembly est référencé et que la classe est visible:
typeof(namespace.a.b.ClassName)
GetType renvoie la valeur null car le type n'est pas trouvé. Avec typeof, le compilateur peut vous aider à trouver l'erreur.
Essayez d’utiliser le nom de type complet qui inclut les informations sur l’assemblage, par exemple:
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
J'avais la même situation lorsque je n'utilisais que le namesspace.classname pour obtenir le type d'une classe dans un Assembly différent et cela ne fonctionnerait pas. Ne fonctionne que lorsque j'ai inclus les informations d'assemblage dans ma chaîne de caractères, comme indiqué ci-dessus.
Assurez-vous que la virgule se trouve directement après le nom complet
typeof(namespace.a.b.ClassName, AssemblyName)
Comme cela ne fonctionnera pas
typeof(namespace.a.b.ClassName ,AssemblyName)
J'ai été perplexe pendant quelques jours sur celui-ci
Comme Type.GetType (String) vous avez besoin du Type.AssemblyQualifiedName , vous devez utiliser 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);
En tant que assemblyName, vous n'avez pas besoin de FullName, seul le nom sans la version, la culture et le PublicKeyToken est requis.
Cette la solution ci-dessus semble être la meilleure pour moi, mais cela n'a pas fonctionné pour moi, donc je l'ai fait comme suit:
AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);
Type myType = Type.GetType(typeAssemblyQualifiedName);
La condition préalable est que vous connaissiez le chemin de l'Assemblée. Dans mon cas, je le sais car il s'agit d'un assemblage construit à partir d'un autre projet interne et inclus dans le dossier bin de notre projet.
Au cas où j'utiliserais Visual Studio 2013, mon objectif .NET est 4.0. Ceci est un projet ASP.NET, je reçois donc un chemin absolu via HttpContext
. Toutefois, le chemin absolu n’est pas une exigence, comme il semble en provenir de MSDN sur AssemblyQualifiedNames
Pour moi, un "+" était la clé! C'est ma classe (c'est une classe imbriquée):
namespace PortalServices
{
public class PortalManagement : WebService
{
public class Merchant
{}
}
}
et cette ligne de code a fonctionné:
Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
J'ai triché. Puisque les types que je veux créer (par nom) sont tous dans une dll que je contrôle, je viens de mettre une méthode statique dans la dll de l'assembly qui prend un nom simple et appelle type.GetType à partir de ce contexte et renvoie le résultat .
L'objectif initial était de pouvoir spécifier le type par son nom dans les données de configuration. Depuis, j'ai modifié le code afin que l'utilisateur spécifie un format à traiter. Les classes de gestionnaire de format implémentent une interface qui détermine si le type peut analyser le format spécifié. J'utilise ensuite la réflexion pour rechercher les types qui implémentent l'interface et pour en trouver un qui gère le format. Alors maintenant, la configuration spécifie un nom de format, pas un type spécifique. Le code de réflexion peut regarder les dll adjacentes et charger, donc j'ai l'architecture du plug-in d'un type médiocre.