2010-11-18 8 views
8

Disculpa si me falta algo obvio, pero cuando creo un nuevo tipo con Reflection.Emit, ¿cómo especifico en qué espacio de nombres debería estar?Cómo especificar el espacio de nombres para un tipo creado a través de Reflection.Emit?

es decir ..

AssemblyName assemblyName = new AssemblyName(); 
assemblyName.Name = "TestDynamic"; 

AssemblyBuilder assemblyBuilder = 
    AppDomain.CurrentDomain.DefineDynamicAssembly(
     assemblyName, 
     AssemblyBuilderAccess.Save); 

ModuleBuilder moduleBuilder =  
    AssemblyBuilder.DefineDynamicModule("TestDynamic", "TestDynamic.dll"); 

TypeBuilder myTestInterface = 
    moduleBuilder.DefineType("MyTestInterface", 
    TypeAttributes.Public | TypeAttributes.Interface, typeof(object)); 

¿Cómo hacerle un espacio de nombres para ?

Respuesta

11

Defínelo donde se define el tipo:

moduleBuilder.DefineType("MyNamespace.MyTestInterface", 
       TypeAttributes.Public | TypeAttributes.Interface, 
       typeof(object)); 
+0

D'oh! Sabía que tenía que ser algo obvio. Gracias amigo. –

0

sólo hay que poner antes de que el nombre de tipo "corto". "Namespace.Subnamespace.Type"

+0

Eso simplemente no es cierto, los tipos se identifican por alcance (ensamblado, módulo u otro tipo si el tipo está anidado), espacio de nombres y nombre. –

+0

olvidé agregar el conjunto. aún así, el CLR no sabe nada sobre espacios de nombres, por lo que yo sé. – Botz3000

+0

El ECMA-335 especifica que los tipos se identifican por su nombre completo dentro del alcance de sus respectivos ensamblajes. Su nombre completo se construye a partir de los metadatos de los tipos que se componen del espacio de nombres y el nombre, que se almacenan como dos entidades distintas. Eso es bastante diferente de no saber nada. En el caso de SRE, la implementación simplemente dividirá el nombre completo para usted según la regla simple edicted en el ECMA 335 (dividido en el último punto). –

Cuestiones relacionadas