2010-04-16 5 views
0

J'essaye de créer l'instance de la classe en employant la réflexion dans le site Web d'ASP.net. Class ClassName est défini et situé dans le dossier App_code. La ligne suivante renvoie null, ce qui pourrait être faux.Type.GetType ("NameSpace.ClassName", false, true) renvoie null. Quel pourrait être le problème?

Type type = Type.GetType("NameSpace.ClassName", false, true); 
+1

Nous devons être très clairs sur celui-ci: Est-ce que c'est un site Web ou une application Web? La différence est significative. –

Répondre

2

AFIN, essayez ceci. Ceci est à greffer sur la réponse d'Adam Robinson et de démontrer ce que vous devez faire pour tester les déclarations faites dans la réponse et les commentaires pour vous-même.

Type t = typeof(YourNamespace.YourClass); 
string assemblyQualifiedName = t.AssemblyQualifiedName; 
Type type = Type.GetType(assemblyQualifiedName, false, true); 
// type will not be null 

Le nom de montage qualifié sera quelque chose comme "Sample.Foo, App_Code.qwijwhsy, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null".

+0

Je crois que typeof ("quelque chose") retournerait le type String ... – Kyte

+0

Avait une paire de citations errant. Supprimé –

+0

@Kyte: typeof renvoie définitivement l'instance de System.Type. – CodeRipper

8

ne fournit que le nom du type ne fonctionne que dans les scénarios suivants:

  • Le type en question est dans l'ensemble en cours d'exécution (c.-à-la même ensemble que votre code)

OU

  • Le type en question est dans mscorlib.dll.

Dans tous les autres cas, vous devez fournir le assembly-qualified name du type. C'est ce qui lui permet de localiser l'ensemble approprié et de le charger.

+0

Oui, NameSpace.ClassName se trouve dans le même assembly où se trouve ce code. – afin

+0

Dans ce cas, le nom de l'assembly doit être 'App_Code.dll' ou' __code.dll' –

+1

@afin: Non. Il se trouve dans le même projet, mais il est compilé dans un autre assemblage. – SLaks

0

Essayez d'utiliser Assembly.GetType(), qui devrait ressembler à l'assembly référencé. Bien sûr, vous devez charger la classe Assembly appropriée, GetCallingAssembly() si le type partage l'assembly avec votre code en cours d'exécution ou autre chose, auquel cas vous utiliserez l'une des méthodes statiques LoadSomething() dans la classe Assemblée.

Par exemple:

Type type = LoadFrom("App_code\ClassAssembly.dll").GetType("Namespace.ClassName"); 
// Load assembly, then type! 
Type type2 = GetCallingAssembly().GetType("Namespace.ClassName"); 
// If it's the same assembly as the calling code. 
0

Code très simple. Je pense que cela n'a pas besoin d'explication.

using System.Reflection; 

Assembly assembly = Assembly.LoadFrom("MyLibrary.dll"); 
Type type = assembly.GetType("NameSpace.ClassName", false, true); 
0

si son dans App_Code essayer

Type t = Type.Get("Namespace.ClassName, __code"); 
4

Vous pouvez utiliser par exemple System.Web.Compilation.BuildManager.GetType

using System.Web.Compilation; 

Type t = BuildManager.GetType("NameSpace.ClassName", true); 
Questions connexes