2012-02-14 18 views
15
Type.GetType("TheClass"); 

devoluciones null si el namespace no está presente como:evitar dar nombre de espacio de nombres en Type.GetType()

Type.GetType("SomeNamespace.TheClass"); // returns a Type object 

¿Hay alguna manera de evitar dar el nombre namespace?

+4

¿Se da cuenta de que podría tener múltiples clases diferentes llamadas TheClass en un proyecto donde se han agregado muchas referencias y el archivo donde intenta resolver el tipo tiene muchas instrucciones de uso? Debe pasar el nombre totalmente calificado, incluido el espacio de nombres, como cuando se hace referencia en un documento en el que escribe Nombre y Apellido. ¿Cuál de las muchas clases de TheClass debería usar el compilador en caso de que haya muchos presentes? Namespace dice cuál. –

+0

Lanzaría 'ArgumentException' en lugar de solo devolver' null'. No se puede distinguir sin 'Namespace' – gdoron

+0

posible duplicado de [Obtención de un System.Type del nombre parcial del tipo] (http://stackoverflow.com/questions/179102/getting-a-system-type-from-types-partial -name) – nawfal

Respuesta

-1

Ese es el parámetro que el método espera obtener, entonces no. No puedes.

typeName: nombre de tipo calificado por su espacio de nombre.

MSDN

¿Cómo espera que distinguir entre dos clases con el mismo nombre pero diferente de espacio de nombres?

namespace one 
{ 
    public class TheClass 
    { 
    } 
} 

namespace two 
{ 
    public class TheClass 
    { 
    } 
} 

Type.GetType("TheClass") // Which?! 
+0

Según mi necesidad, no hay una situación como esta. –

+0

De acuerdo con mi necesidad, no habrá ninguna situación como esta. Entonces, en ese caso, ¿cómo puedo hacerlo? –

+4

@Nleshleak, espero que se den cuenta de que Microsoft no diseñó el framework .NET de acuerdo con ** sus ** necesidades, sino que fue diseñado para ser utilizado en escenarios mucho más amplios. Como, por ejemplo, un escenario donde tienes el mismo nombre de clase en dos espacios de nombres diferentes. –

39

he utilizado un método de ayuda que se buscan todos los cargado Assembly s para un Type que coincida con el nombre especificado. Aunque en mi código solo se esperaba un resultado de tipo, admite múltiples. Verifico que solo se devuelve un resultado cada vez que lo uso y sugiero que haga lo mismo.

/// <summary> 
/// Gets a all Type instances matching the specified class name with just non-namespace qualified class name. 
/// </summary> 
/// <param name="className">Name of the class sought.</param> 
/// <returns>Types that have the class name specified. They may not be in the same namespace.</returns> 
public static Type[] getTypeByName(string className) 
{ 
    List<Type> returnVal = new List<Type>(); 

    foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) 
    { 
     Type[] assemblyTypes = a.GetTypes(); 
     for (int j = 0; j < assemblyTypes.Length; j++) 
     { 
      if (assemblyTypes[j].Name == className) 
      { 
       returnVal.Add(assemblyTypes[j]); 
      } 
     } 
    } 

    return returnVal.ToArray(); 
} 
+19

+1 para responder la pregunta en lugar de acumular en la guerra de llamas anterior. –

+2

otra respuesta que es de alguien que sabe en lugar de no usar ningún espacio de nombres bla bla :) ty para la respuesta – MonsterMMORPG

+0

fantástico, hace lo que dice. Lo principal que agregaría a esto sería usar assemblyTypes [j] .Name.EqualsIgnoreCase (className). – sirthomas

Cuestiones relacionadas