Я пишу библиотеку классов для веб-API.
У меня есть базовый класс и интерфейс с 30 блоками:
interface ISomethingApi {
void AuthenticateAsync(string username, string password);
event AsyncResponseHandler AuthenticateEnded;
void GetMemberAsync(string username);
event AsyncResponseHandler<Member> GetMemberEnded;
// more...
}
Базовый класс BaseHttpClient содержит реализацию, и все методы являются пустыми и виртуальными.
class BaseHttpClient : ISomethingApi {
public virtual void GetMemberAsync(string username) {
throw new NotImplementedException();
}
public event AsyncResponseHandler<Member> GetMemberEnded;
// more...
}
Поскольку API довольно нестандартный, я наследую базовый класс с классом XmlClient. Этот класс переопределяет виртуальные методы и выполняет работу.
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 -=
}
}
Проблема в том, что я не могу поднять события:
Событие BaseHttpClient.LogoffEnded может появляться только в левой части + = или - =
Основным решением является создание методов в базовом классе, таких как
protected void RaiseLogoffEnded(AsyncResponseArgs args) {
if (LogoffEnded != null) {
LogoffEnded(this, args);
}
}
Но существует слишком много способов для создания. Я хотел бы сделать что-то вроде:
public override void GetMemberAsync(string username) {
Member member;
// work done here
RaiseEvent(x => x.GetMemberEnded, new AsyncResponseArgs<Member>(member));
}
Полагаю, речь идет об отражении и выражениях.
- Это правильный способ сделать? (Performace)
- Какую документацию я мог бы прочитать, чтобы сделать это?
- Не могли бы вы показать мне действительный код для этого?