web-dev-qa-db-fra.com

Type.GetType ("namespace.a.b.ClassName") renvoie la valeur null

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.

194
Omu

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")
210
DrPizza

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).

170
Asaf Pala

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 ;
        }
73
peyman

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);
24
LarryBud
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;
}
24
erikkallen

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);
11
Numan KIZILIRMAK

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 ...)

8
Ruben Bartelink

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();
6
Marchino

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.

6
Stephan

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.

4
Guillaume

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.

4
Ismail Hawayel

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

3
jack_tux

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.

2
Florian Talour

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

1
Ozair Kafray

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");
1
Arash Masir

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.

0
Darrel Lee