Alias ​​per tipo e risoluzione delle collisioni di assiemi esterni

Alias ​​per tipo e risoluzione delle collisioni di assiemi esterni

Digita alias

È possibile che due classi con lo stesso nome risiedano nello stesso assieme o in assiemi diversi, ma non possiamo cambiare il nome delle classi a causa di limitazioni di progettazione.

Supponiamo di avere una classe in AssemblyA come mostrato nella figura 1 di seguito.

E sto facendo riferimento a AssemblyA nel mio progetto e sto usando l'istanza di MyClass come mostrato nel seguente frammento di codice.

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();
        }
    }
}

Ora nel progetto sorge la necessità di creare una nuova classe denominata MyClass nello stesso progetto ma potrebbe trovarsi nello stesso assembly o in un assembly diverso. E dobbiamo nominare la nuova classe come MyClass solo a causa di alcune restrizioni di denominazione o per altri problemi, come mostrato nella figura seguente.

Ora, se dobbiamo accedere alla nuova classe lungo la classe creata in precedenza, dobbiamo utilizzare un nome completo della classe insieme all'assembly come mostrato nello snippet di codice di seguito.

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

Il codice sopra può essere un po' goffo e difficile da mantenere se dobbiamo usare la stessa classe in molti posti.
Invece possiamo creare un alias di tipo come mostrato in il seguente frammento di codice e utilizzalo al posto del nome completo dello spazio dei nomi.

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();
        }
    }
}

Quando eseguiamo il codice sopra possiamo vedere che viene creata l'istanza2 della MyClass presente nella sottocartella di AssemblyA come mostrato in figura.

Risoluzione del conflitto di assemblea per le classi

A volte ci sono casi in cui uno stesso nome di classe esiste in due assembly con gli stessi namespace a cui vogliamo fare riferimento nel nostro progetto. Se entrambi questi assiemi vengono creati da noi, in tal caso possiamo semplicemente modificare il nome della classe e dell'assieme, se possibile. Ma supponiamo che entrambi questi assembly siano sviluppati da terze parti, in tal caso è quasi impossibile cambiare il nome della classe. In tal caso il compilatore non sarà in grado di capire a quale spazio dei nomi fare riferimento per creare un'istanza della classe.
Supponiamo di avere due assembly ClassLibrary1 e ClassLibrary2 ma con lo stesso spazio dei nomi e nome di classe rispettivamente di MyNamespace e MyClass come mostrato in i frammenti di codice seguenti.

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";
        }
    }
}

Se aggiungo un riferimento a entrambi questi assembly e se provo a creare un'istanza di MyClass, otterremo un errore in fase di compilazione come "MyClass esiste sia in ClassLibrary1 che in ClassLibrary2" o "il tipo completamente qualificato esiste in entrambi gli assembly"
Per risolvere questo errore, dobbiamo fornire l'alias a entrambi questi assembly come mostrato di seguito.
Fare clic con il pulsante destro del mouse sull'assembly e aprire le proprietà come mostrato di seguito. figura. Ho modificato l'alias per entrambi gli assembly in Lib1 e Lib2.

Dopo aver modificato l'alias per lo spazio dei nomi, dobbiamo fare riferimento all'alias modificato nel nostro codice come mostrato di seguito.

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();
        }
    }
}

Dopo aver eseguito il debug del codice sopra, possiamo vedere che entrambe queste istanze create appartengono alle rispettive classi.

In questo blog ho dimostrato come possiamo aggiungere alias di tipo e alias assembly.