La didascalia è confusa. Vorrei chiarire un po ':C'è un modo per creare eventi indicizzati in C# (o qualche soluzione alternativa)?
Mi piacerebbe fornire eventi che dipendono da un parametro in modo che un osservatore possa decidere di ricevere eventi se accade qualcosa ad uno specifico "id". Potrebbe apparire come segue: (? Per esempio, come possiamo gestire disiscrizione)
public event EventHandler Foo (string id);
Sono consapevole che questa sintassi è sbagliata in .NET 3.5, e sono anche consapevole del fatto che questa idea introduce ulteriore problema .
Come si deve risolvere questo problema? Ho pensato di usare qualcosa come:
public EventHandler Foo (string id);
che è almeno la sintassi legale e potrebbe funzionare, ma ancora non sembra molto grande per me.
Edit: Sono non chiedendo di passaggio di argomenti alla funzione di callback. La mia idea è più simile a questo:
class Bleh
{
public event EventHandler Foo (string index);
private void RaiseEvents() // this is called by a timer or whatever
{
Foo["asdf"] (this, EventArgs.Empty); // raises event for all subscribers of Foo with a parameter of "asdf"
Foo["97"] (this, EventArgs.Empty); // same for all "97"-subscribers
// above syntax is pure fiction, obviously
}
}
// subscribe for asdf events via:
Bleh x = new Bleh();
x.Foo["asdf"] += (s, e) => {};
Spiegazione
Dal momento che vi starete chiedendo il motivo per cui cerco di fare questo, mi spiego la mia situazione. Ho una classe che fornisce posizioni di determinati oggetti (ognuno identificato da una stringa ID).
Invece di fornire uno event EventHandler<PositionChangedEventArgs>
elevato per QUALSIASI cambiamento di posizione, mi piacerebbe avere un evento per ogni oggetto (a cui si accede da un indice), in modo che gli osservatori possano ascoltare gli eventi solo per un ID specifico.
Chiarimento (correggetemi se la mia interpretazione è sbagliata): Il controllo [per il quale gli ascoltatori di aumentare] è fatto prima di [se sollevare a quel ascoltatore] l'evento è licenziato, piuttosto che DOPO [l'abbonato lo ignora se non richiesto]. – Russell
Esattamente. Il filtraggio deve essere eseguito alla fonte dell'evento. – mafu