Я предполагаю, что вы управляете классом Foo, поскольку вы говорите о добавлении в него события как одного из вариантов.Поскольку у вас есть класс, есть ли причина, по которой вы не можете определить собственную реализацию IObservable для метода Do?
public class Foo
{
DoObservable _doValues = new DoObservable();
public IObservable<String> DoValues
{
return _doValues;
}
public string Do(int param)
{
string result;
// whatever
_doValues.Notify(result);
}
}
public class DoObservable : IObservable<String>
{
List<IObserver<String>> _observers = new List<IObserver<String>>();
public void Notify(string s)
{
foreach (var obs in _observers) obs.OnNext(s);
}
public IObserver<String> Subscribe(IObserver<String> observer)
{
_observers.Add(observer);
return observer;
}
}
В вашем классе теперь есть свойство Observable<String>
, которое предоставляет способ подписки назначения, возвращаемые методом Do:
public class StringWriter : IObserver<String>
{
public void OnNext(string value)
{
Console.WriteLine("Do returned " + value);
}
// and the other IObserver<String> methods
}
var subscriber = myFooInstance.DoValues.Subscribe(new StringWriter());
// from now on, anytime myFooInstance.Do() is called, the value it
// returns will be written to the console by the StringWriter observer.
Я не слишком увлекался реактивной структурой, но я думаю, что это близко к тому, как вы это сделаете.