Alias ​​para Tipo y resolución de colisión de ensamblado externo

Alias ​​para Tipo y resolución de colisión de ensamblado externo

Alias ​​de tipo

Puede haber posibilidades de que tengamos dos clases con el mismo nombre que residen en el mismo ensamblaje o en ensamblajes diferentes, pero no podemos  cambiar el nombre de las clases debido a restricciones de diseño.

Supongamos que tengo una clase en AssemblyA como se muestra en la siguiente figura 1.

Y estoy haciendo referencia a AssemblyA en mi proyecto y usando la instancia de MyClass como se muestra en el siguiente fragmento de código.

using AssemblyA;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TypeAliases
{
    class Program
    {
        static void Main(string[] args)
        {
            var instance = new MyClass();
        }
    }
}

Ahora surge la necesidad en el proyecto de crear una nueva clase llamada MyClass en el mismo proyecto pero podría estar en el mismo ensamblaje o en un ensamblaje diferente. Y tenemos que nombrar la nueva clase como MyClass solo debido a algunas restricciones de nombres o debido a otras preocupaciones, como se muestra en la siguiente figura.

Ahora, si tenemos que acceder a la nueva clase junto con la clase creada anteriormente, tenemos que usar un nombre completo de la clase junto con el ensamblado, como se muestra en el fragmento de código a continuación.

static void Main(string[] args)
        {
            var instance = new MyClass();
            var instance2 = new AssemblyA.SubAssembly.MyClass();
        }

El código anterior puede ser un poco torpe y difícil de mantener si tenemos que usar la misma clase en muchos lugares.
En su lugar, podemos crear un tipo de alias como se muestra en el siguiente fragmento de código y utilícelo en lugar del nombre completo del espacio de nombres.

using AssemblyA;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MyClass2 = AssemblyA.SubAssembly.MyClass;

namespace TypeAliases
{
    class Program
    {
        static void Main(string[] args)
        {
            var instance = new MyClass();
            var instance2 = new MyClass2();
        }
    }
}

Cuando ejecutamos el código anterior podemos ver que se crea la instancia2 de MyClass presente en la subcarpeta de AssemblyA como se muestra en la figura.

Resolución de conflictos de montaje para clases

A veces hay casos en los que existe el mismo nombre de clase en dos ensamblajes con los mismos espacios de nombres a los que queremos hacer referencia en nuestro proyecto. Si ambos ensamblajes los creamos nosotros, en ese caso, podemos simplemente cambiar el nombre de la clase y el ensamblaje si es posible. Pero supongamos que ambos ensamblajes son desarrollados por un tercero, en ese caso es casi imposible cambiar el nombre de la clase. En ese caso, el compilador no podrá averiguar a qué espacio de nombres hacer referencia para crear una instancia de la clase.
Supongamos que tengo dos ensamblajes ClassLibrary1 y ClassLibrary2 pero con el mismo espacio de nombres y nombre de clase que MyNamespace y MyClass respectivamente, como se muestra en los siguientes fragmentos de código.

namespace MyNamespace
{
    public class MyClass
    {
        public override string ToString()
        {
            return "I am in ClassLibrary1";
        }
    }
}
namespace MyNamespace
{
    public class MyClass
    {
        public override string ToString()
        {
            return "I am in classLibrary2";
        }
    }
}

Si agrego una referencia a estos dos ensamblajes y trato de crear una instancia de MyClass, obtendremos un error de tiempo de compilación como "MyClass existe tanto en ClassLibrary1 como en ClassLibrary2" o "El tipo de calificación completa existe en ambos ensamblajes"
Para resolver este error, tenemos que dar el alias a ambos ensamblajes como se muestra a continuación.
Haga clic con el botón derecho en el ensamblaje y abra las propiedades como se muestra a continuación figura. He cambiado el alias de ambos ensamblajes a Lib1 y Lib2.

Después de cambiar el alias del espacio de nombres, debemos referirnos al alias modificado en nuestro código, como se muestra a continuación.

extern alias Lib2;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;



namespace TypeAliases
{
    class Program
    {
        static void Main(string[] args)
        {
            var inst1 = new Lib1.MyNamespace.MyClass();
            var inst2 = new Lib2.MyNamespace.MyClass();
        }
    }
}

Después de depurar el código anterior, podemos ver que ambas instancias creadas son de las clases respectivas.

En este blog he demostrado cómo podemos agregar alias de tipo y alias de ensamblado.