У меня есть вопрос, используя Observables в Silverlight 4 для выполнения вызовов WCF.
Рассмотрим простой вызов веб-службы ниже.
var adminclient = ServiceProxy.WithFactory<AuthenticationClient>();
var results= Observable.FromEvent<AuthorizeAdministratorCompletedEventArgs>(
s => adminclient.AuthorizeAdministratorCompleted += s,
s => adminclient.AuthorizeAdministratorCompleted -= s).ObserveOnDispatcher();
adminclient.AuthorizeAdministratorAsync();
results.Subscribe(e =>
{
//Enable UI Button
});
Я реализовал метод расширения, который обертывает метод подписки, он выполняет некоторую проверку ошибок при возврате.
На возврат Результаты. Подписка (e =>
e is System.Collections.Generic.Event<AuthorizeAdministratorCompletedEventArgs>
почти каждый запрос будет иметь другой тип возврата, такой как:
e is System.Collections.Generic.Event<AsyncCompletedEventArgs>
если бы у меня была оболочка, которая выглядела примерно так, как я могу привести каждый тип xxxCompletedEventArgs к его базовому типу AsyncCompletedEventArgs , чтобы я мог получить доступ к e.EventArgs и проверьте Ошибка свойство
public static IDisposable Subscribe<TSource>(this IObservable<TSource> source, Action<TSource> onNext = null, Action onError = null, Action onFinal = null)
{
Action<TSource> onNextWrapper = (s) =>
{
var args = (System.Collections.Generic.IEvent<AsyncCompletedEventArgs>)s;
try
{
if (WCFExceptionHandler.HandleError(args.EventArgs))
{
if (onNext != null)
onNext(s);
}
else
{
if (onError != null)
onError();
}
}
finally
{
if (onFinal != null)
onFinal();
}
};
return source.Subscribe<TSource>(onNextWrapper, (e) => { throw e; });
}
Приведенный выше код не будет работать
Невозможно привести объект типа 'System.Collections.Generic.Event
1 [MyProject.Provider.AuthorizeAdministratorCompletedEventArgs] 'для ввода' System.Collections.Generic.IEvent 1[System.ComponentModel.AsyncCompletedEventArgs]'
Это определение метода WCFExceptionHandler.HandleError (args.EventArgs))
public static bool HandleError(AsyncCompletedEventArgs e)