In tal caso la situazione cambia. Il VB.Net fornisce il cosiddetto "Late Binding" (Associazione tardiva), e dato che C# e VB.Net compilano entrambi codice CIL, è possibile emulare il Late Binding del VB anche in C#
Per farlo devi usare la reflection; ti conviene scrivere una funzione da richiamare per non dover riscrivere il codice ogni volta:
/// <summary>
/// Esegue la funzione "FunctionName" con associazione tardiva
/// </summary>
/// <param name="FunctionContainer">
/// L'oggetto su cui richiamare la funzione,
/// oppure null se è una classe statica
/// </param>
/// <param name="ContainerType">
/// Il tipo dell'oggetto su cui chiamare la funzione.
/// Necessario se la classe è statica, altrimenti si può passare null
/// </param>
/// <param name="FunctionName">Il nome della funzione da chiamare</param>
/// <param name="Parameters">I Parametri della funzione</param>
/// <returns>
/// Il valore di ritorno della funzione,
/// o null se non ritorna alcun valore
/// </returns>
static object LateCall(Object FunctionContainer, Type ContainerType,
string FunctionName, [Optional] params Object[] Parameters)
{
Type[] pTypes = null;
if (Parameters != null && Parameters.Length > 0)
{
pTypes = new Type[Parameters.Length];
for (int i = 0; i < Parameters.Length; i++)
{
pTypes[i] = Parameters[i].GetType();
}
}
if (ContainerType == null)
{
if (FunctionContainer == null)
{
throw new ArgumentException("Almeno uno fra FunctionContainer e " +
"ContainerType deve essere non null");
}
ContainerType = FunctionContainer.GetType();
}
MethodInfo method = ContainerType.GetMethod(FunctionName,
BindingFlags.Instance | BindingFlags.Static |
BindingFlags.Public | BindingFlags.NonPublic,
null, pTypes, null);
if (method != null)
{
return method.Invoke(FunctionContainer, Parameters);
}
else
{
throw new ArgumentException("Funzione in overload non trovata");
}
}
A questo punto, se hai una funzione Test all'interno di una classe statica Functions, la chiami in questo modo:
Object item = new Pippo();
LateCall(null, typeof(Functions), "Test", item);
item = new Pluto();
LateCall(null, typeof(Functions), "Test", item);
Ti avviso comunque che chiamare una funzione con Late Binding aggiunge molto overhead, e quindi i tempi di chiamata si dilatano parecchio.
Luca