Credo di aver capito il tuo problema, ma la soluzione che hai scelto è inapplicabile e soprattutto si risolve in modo brillante e naturale applicando un semplice principio della programmazione orientata agli oggetti: l'ereditarietà.
Ciò che devi fare è creare una classe base dalla quale derivino tutte le classi che inserisci nella tua lista; tale classe base dovrà contenere i metodi che desideri richiamare per qualsiasi oggetto inserito in lista, indipendentemente dalla classe di appartenenza.
Sto usando un approccio simile per gestire un'interfaccia utente: tutte le pagine che mostro sono ereditate da una classe base che costituisce la "pagina" generale standardizzata. Supponiamo che una pagina generica abbia un titolo resituito da un metodo:
codice:
class BasePage
{
protected virtual string GetTitle()
{
return "";
}
}
A questo punto, puoi creare tutte le classi discendenti che vuoi, ridefinendo il metodo che restituisce il titolo per modificarne il valore di ritorno:
codice:
class AboutPage : BasePage
{
protected override string GetTitle()
{
return "Informazioni su...";
}
}
class HelpPage : BasePage
{
protected override string GetTitle()
{
return "Aiuto in linea";
}
}
Supponi ora di avere creato un numero indefinito di istanze per le classi sopra riportate (e altre eventuali discendenti dalla classe base) e di averle inserite in un array.
Quando una classe eredita da una classe base superiore, ne acquisisce automaticamente i metodi esposti e, siccome ciascun metodo rappresenta un "messaggio" che può essere inviato a tale classe, ciò significa che possiamo inviare a ciascuna instanza il messaggio GetTitle semplicemente trattandole come il tipo base cui appartengono, cioè BasePage:
codice:
currentPageTitle = ((BasePage) availablePages[0]).GetTitle;
Il codice sopra richiede che tutte le classi di appartenenza degli oggetti nel vettore availablePages discendano da BasePage; in tal caso, il "cast" è possibile, cioè è possibile trattare tutti gli oggetti come se appartenessero al tipo BasePage (condizione effettivamente verificata) e ottenere il titolo attraverso il metodo GetTitle; ciascuna classe discendente ridefinisce il comportamento del metodo restituendo una stringa differente, quindi otterremo un titolo diverso in base al tipo di oggetto cui ci stiamo riferendo con l'indice di posizione nel vettore.
Si tratta dell'ABC della programmazione orientata agli oggetti: ereditarietà e polimorfismo.
Secondo me, si tratta di concetti essenziali che vanno approfonditi con la lettura di un buon libro a riguardo prima di procedere col lambiccarsi il cervello con soluzioni inattuabili quando la più semplice e pulita viene fornita "di serie" con il linguaggio e la piattaforma adottata, come avviene in questo caso con C# e .NET Framework.
Ciao!