2010-04-09 9 views

Respuesta

4

Su pregunta "¿Cómo comprobar si la cadena es un espacio de nombres" sólo es válida si tenemos en cuenta donde está comprobando las espacios de nombres

Los espacios de nombres son prefijos a los nombres de clase y las clases tienen un alcance para un ensamblaje. Para verificar si existe un espacio de nombres, debe decidir qué ensamblajes está preparado para revisar para encontrar la existencia del espacio de nombres.

Una vez que haya decidido qué asambleas que está preparado para mirar a través, puede iterar a través de ellos para la existencia de un espacio de nombres particular, de este modo:

public bool NamespaceExists(IEnumerable<Assembly> assemblies, string ns) 
{ 
    foreach(Assembly assembly in assemblies) 
    { 
     if(assembly.GetTypes().Any(type => type.Namespace == ns)) 
      return true; 
    } 

    return false; 
} 
+0

Por cierto, no se puede utilizar palabra clave reservada 'namespace' como nombre de variable;) – abatishchev

+0

Solo por el bien de la corrección, debe @ize el parámetro del espacio de nombres, el espacio de nombres es una palabra clave C# :) – Marek

+1

¡Oh, qué exigente! Estoy bastante seguro de que la respuesta es legible sin, pero una edición es tuya. :) –

0

El CLR no tiene realmente un concepto de "espacios de nombres": en realidad son poco más que una convención de nomenclatura. Por lo tanto, no hay API para "enumerar espacios de nombres" o "obtener espacios de nombres" o incluso "obtener todos los tipos en este espacio de nombres".

Lo mejor que se puede hacer es recorrer todos los ensamblajes cargados, recorrer todos los tipos exportados en cada uno de esos ensamblajes y verificar si la cadena dada es un "prefijo" en cualquiera de esos nombres de tipos. Me imagino que esta solución no sería la más rápida del mundo, pero tampoco sería totalmente inviable.

-2

No hay reflexión sobre espacios de nombres. Los espacios de nombres definen el nombre de tipo completo. Así que lo que hay que hacer es:

  • Enumerar todos los tipos (no se especifica el conjunto de la fuente, digamos .NET Framework, entonces usted necesita incluir todas las asambleas por defecto .NET (mirar a los que hace referencia VS cuando crea un proyecto), o su ensamblaje personalizado, luego ingresa el ensamblaje).
  • Busque la propiedad espacio de nombres del tipo dado

Lo que hay que utilizar:

Assembly.Load method

Assembly.GetTypes method

Type.Namespace property

2

has podido hacer esto?

Assembly asm = Assembly.GetExecutingAssembly(); 
List<string> namespaceList = new List<string>(); 

foreach (Type type in asm.GetTypes()) 
{ 
    namespaceList.Add(type.Namespace); 
} 

¿Entonces simplemente verifique si la cadena está en la lista?

(Tenga en cuenta, esto no es a prueba de código!)

8

probar este enfoque:

using System.CodeDom.Compiler; 
using System.Linq; 

class NamespaceTester : IDisposable 
{ 
    private CodeDomProvider provider = CodeDomProvider.CreateProvider("c#"); 
    private CompilerParameters settings = new CompilerParameters(); 
    private CompilerResults results; 

    public bool Test(string[] namespaces) 
    { 
     results = provider.CompileAssemblyFromSource(
      settings, 
      namespaces.Select(n => String.Format("using {0};", n)).ToArray()); 
     return results.Errors 
      .OfType<CompilerError>() 
      .Any(e => String.Equals(
       e.ErrorText, 
       "CS0234", 
       StringComparison.Ordinal)); 
    } 

    public void Dispose() 
    { 
     if (results != null) 
     { 
      System.IO.File.Delete(results.CompiledAssembly.Location); 
     } 
    } 
} 

donde CS0234 es:

El tipo o espacio de nombres 'nombre' hace no existe en la clase o espacio de nombres 'scope' (¿falta una referencia de ensamblaje ?)

referencias propias Añadir:

settings.ReferencedAssemblies.Add("Foobar.dll") 

Uso:

public static void Main(string[] args) 
{ 
    using (var tester = new NamespaceTester()) 
    { 
     var success = tester.Test(new[] { 
      "System.IO", 
      "System.LOL" 
     }); 
    } 
} 
+0

+1 para la diversión – Marek

Cuestiones relacionadas