J'écris une bibliothèque de classes pour une API Web.Comment faire pour élever des événements de classe parent avec Expression (C#)
J'ai une classe de base et une interface avec 30 blocs comme ceci:
interface ISomethingApi {
void AuthenticateAsync(string username, string password);
event AsyncResponseHandler AuthenticateEnded;
void GetMemberAsync(string username);
event AsyncResponseHandler<Member> GetMemberEnded;
// more...
}
La classe de base appelée BaseHttpClient contient la mise en œuvre et toutes les méthodes sont vides et virtuels. Parce que l'API est assez non standard, j'hérite la classe de base avec une classe XmlClient. Cette classe remplace les méthodes virtuelles et fait le travail.
class XmlClient : BaseHttpClient {
public override void GetMemberAsync(string username) {
Member member;
// process here
// raising the event
GetMemberEnded(this, new AsyncResponseArgs<Member>(member));
// error: LogoffEnded can only appear on the left hand side of += or -=
}
}
Le problème est que je ne peux pas lever les événements:
L'événement 'BaseHttpClient.LogoffEnded' ne peut apparaître sur le côté gauche de + = ou - =
Une solution de base est de créer des méthodes dans la classe de base comme
protected void RaiseLogoffEnded(AsyncResponseArgs args) {
if (LogoffEnded != null) {
LogoffEnded(this, args);
}
}
Mais il y a aussi ma ny méthodes à créer. Je voudrais faire quelque chose comme:
public override void GetMemberAsync(string username) {
Member member;
// work done here
RaiseEvent(x => x.GetMemberEnded, new AsyncResponseArgs<Member>(member));
}
Je suppose que cela concerne la réflexion et les expressions.
- Est-ce une bonne façon de faire? (performace)
- Quelle documentation pourrais-je lire pour faire ceci?
- pourriez-vous me montrer un code valide pour cela?
Vous ne savez pas si vous en êtes conscient ou non, mais vous pouvez rendre BaseHttpClient abstrait et déclarer le résumé des membres ISomethingApi au lieu de fournir une implémentation qui lève NotImplementedException. Si vous voulez vraiment lancer une exception, vous devriez envisager d'utiliser NotSupportedException car NotImplementedException suggère qu'il était censé avoir été implémenté par la classe dérivée, auquel cas il aurait dû être abstrait. – Tergiver