Buona l'idea ma stai sbagliando approccio: le classi che racchiudono le funzioni non devono sapere nulla di chi le chiama, devono limitarsi ad elaborare i dati ed a fornire risultati. Il fetch dei dati lo fai prima: nel button_click. ti faccio un esempio:
codice:
protected void Button2_Click(object sender, EventArgs e)
{
//fetch dei dati
int a = Convert.ToInt32(lblA.Text);
int b = Convert.ToInt32(lblb.Text);
//elaborazione che faccio fare alla classe esterna
ClasseFunzioni bll = new ClasseFunzioni();
int s = bll.Somma(a,b);
//presentazione dei risultati
lblS.Text = s;
}
La funzione Somma (inutile che la scrivo) somma due interi e ne restituisce il risultato ma NON SA nulla di chi l'ha chiamata (in questo caso una pagina asp.net). prelevare i dati e presentare i risultati è un lavoro che puoi fare direttamente nell'handler del pulsante.
Rispetto al tuo approccio questo inoltre è molto piu manuntenibile perche se la struttura della pagina cambia (vanno via dieci pulsanti) quello delle funzioni non cambia perche non dipende dalla pagina ma da "richieste di business" (la possibilita di sommare due interi).
Nell esempio mi sono affidato al fatto che i dati delle label fossero validi. Generalmente questi devono essere validati, il lavoro di validazione puoi affidarlo ad un altra classe adhoc e sfruttare lo stesso principio: prelevi le stringhe dalle label le dai come input alle funzioni di conversione che validano, fanno tutto il lavoro a modino e ti restituiscono i risultati. Anche in questo caso la classe non sa nulla del fatto che a chiamarla è stata una pagina asp.net.