Encontré este atributo en this post y this one. Parece que es muy útil cuando necesitamos actualizar un sistema antiguo. Luego creo una solución de prueba (con 3 proyectos en ella) para usar este atributo. En primer lugar, hay un proyecto de biblioteca de clase llamado "Animal".¿Cuál es la forma correcta de usar TypeForwardedToAttribute?
namespace Animal
{
public class Dog
{
public static string Name = "old version";
}
}
Entonces crear un proyecto de aplicación de consola, añadir "Animal" como referencia, y en el método Main
tengo:
Console.WriteLine(Animal.Dog.Name);
Ahora imprime "versión antigua". ¡Estupendo! Ahora comienzo a "actualizar" el proyecto existente. Elimino la clase Dog
en "Animal" añadir otro proyecto de biblioteca de clases llamado "AdvancedAnimal", que contiene:
namespace Animal
{
public class Dog
{
public static string Name = "new version";
}
}
Añadir "AdvancedAnimal" como una referencia en "Animal". También AssemblyInfo.cs
de "Animal" es modificado mediante la adición:
[assembly: TypeForwardedTo(typeof(Animal.Dog))]
de la utilización de este atributo, a partir de ahora todos los Animal.Dog
se remite a la clase Dog
en "AdvancedAnimal" (en realidad no hay una clase Dog
en Animal cualquier Más). Re-compilo toda la solución y espero que la aplicación de la consola imprima "nueva versión". Pero me da un error de compilación:
The type name 'Dog' could not be found in the namespace 'Animal'. This type has been forwarded to assembly 'AdvancedAnimal, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' Consider adding a reference to that assembly.
Oh, me han dicho que añadir "AdvancedAnimal" como una referencia a mi aplicación de consola! Pero si lo hago, ya no necesito el atributo, porque si agrego "AdvancedAnimal" como referencia en la aplicación de consola, por supuesto Animal.Dog
se refiere al de "AdvancedAnimal". Lo que espero es que al modificar "Animal", agregando "AdvancedAnimal", no sea necesario cambiar todos los otros proyectos/bibliotecas de clases porque la información del ensamblado ya proporciona suficiente información. Eso es realmente conveniente al actualizar un sistema. De lo contrario, tengo 20 proyectos que se refieren a "Animal", necesito agregar "AdvancedAnimal" como referencia para todos ellos. Y lo más importante es que no puedo encontrar ningún uso de "TypeForwardedToAttribute" en esta solución, eliminarlo no importa nada. ¿Puedes decirme qué pasa con mi prueba/idea?
"Pero lo que está haciendo es reenviar el tipo del mismo ensamblaje a otro tipo en el mismo ensamblaje", no. dos asambleas, "Animal" y "Animal avanzado". –
Pero el espacio de nombres sigue siendo "Animal", porque en una de las publicaciones el autor dice que no podemos cambiar el espacio de nombres aquí. –
Lo que hice fue exactamente lo que me dijiste, pero no está funcionando como se esperaba. –