[英]How Can I Unfold This Event into an Observable Sequence?
Well, just when I think I've got a handle on things, I get thrown another curve. 好吧,就在我认为自己对事物有把握的时候,我又陷入了另一弯。
I'm trying to create an observable sequence instead of doing this: 我正在尝试创建一个可观察的序列, 而不是这样做:
((Outlook.MAPIFolderEvents_12_Event)calendarFolder).BeforeItemMove +=
Calendar_BeforeItemMove;
private void Calendar_BeforeItemMove(
object item,
Outlook.MAPIFolder destFolder,
ref bool cancel){ /*...*/ }
I'm trying to use the Observable.FromEventPattern<TDelegate, TEventArgs> (Func<EventHandler<TEventArgs>, TDelegate>, Action<TDelegate>, Action<TDelegate>)
method, but because of the required parameters I'm meeting with little success. 我正在尝试使用Observable.FromEventPattern<TDelegate, TEventArgs> (Func<EventHandler<TEventArgs>, TDelegate>, Action<TDelegate>, Action<TDelegate>)
方法,但是由于所需的参数,我几乎没有遇到成功。 The closest I have been able to come is: 我最接近的是:
var itemBeforeMovedObservable = Observable
.FromEvent<Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler, object>(handler =>
{
Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler bimEventHandler =
(obj, f, ref cx) => // <-- Cannot resolve symbol 'cx'; Identifier expected
{
handler(obj); // <-- shouldn't this have the other parameters as well?
};
return bimEventHandler;
},
h => ((Outlook.MAPIFolderEvents_12_Event)calendarFolder).BeforeItemMove += h,
h => ((Outlook.MAPIFolderEvents_12_Event)calendarFolder).BeforeItemMove -= h);
Thanks in advance for any guidance. 在此先感谢您的指导。
I don't really have access to a way to test this but I would say you would probably be best off wrapping it up into an operator: 我真的没有办法测试它,但是我想说,您最好将它包装成一个运算符:
//Because that naming is ridiculous
using ItemMoveEventHandler = Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler;
using ItemMoveEvent = Outlook.MAPIFolderEvents_12_Event;
//Used to wrap multiple arguments into a single object
public class MyMoveEventArgs {
public MyMoveEventArgs(Object item, MAPIFolder folder) {
this.Item = item;
this.Folder = folder;
}
public Object Item {get; private set;}
public MAPIFolder Folder {get; private set;}
}
//Create an extension method
public static IObservable<MyMoveEventArgs> BeforeMoveObservable(
this ItemMoveEvent folder,
Func<object, MAPIFolder, bool> shouldCancel) {
return Observable.FromEvent<ItemMoveEventHandler,
MoveEventArgs>
//Use the conversion overload
(emit => new ItemMoveEventHandler(
//The compiler seems to complain about cancel
//being implicit, so explicitly declare your params
(object item, MAPIFolder f, out bool cancel) =>
{
//cancel needs to be set somewhere in the body
if (!(cancel = shouldCancel(item, f)) {
emit(new MyMoveEventArgs(item, f));
}
}
},
h => folder.BeforeItemMove += h,
h => folder.BeforeItemMove -= h);
}
Then you should be able to use it like so (untested): 然后,您应该可以像这样(未经测试)使用它:
calendarFolder.BeforeMoveObservable((obj, folder => /*Return if the event should be cancelled or not*/)
.Subscribe(x => /*Only reach here if the move was successful*/);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.