<p>The compiler usually chokes when an event doesn't appear beside a <code>+=</code> or a <code>-=</code>, so I'm not sure if this is possible.</p>

<p>I want to be able to identify an event by using an Expression tree, so I can create an event watcher for a test. The syntax would look something like this:</p>

<pre><code>using(var foo = new EventWatcher(target, x =&gt; x.MyEventToWatch) {
    // act here
}   // throws on Dispose() if MyEventToWatch hasn't fired
</code></pre>

<p>My questions are twofold:</p>

<ol>
<li>Will the compiler choke? And if so, any suggestions on how to prevent this?</li>
<li>How can I parse the Expression object from the constructor in order to attach to the <code>MyEventToWatch</code> event of <code>target</code>?</li>
</ol>

A .NET event isn't actually an object, it's an endpoint represented by two functions -- one for adding and one for removing a handler.  That's why the compiler won't let you do anything other than += (which represents the add) or -= (which represents the remove).
The only way to refer to an event for metaprogramming purposes is as a System.Reflection.EventInfo, and reflection is probably the best way (if not the only way) to get ahold of one.
EDIT: Emperor XLII has written some beautiful code which should work for your own events, provided you've declared them from C# simply as
```
```
public event DelegateType EventName;
```
```
That's because C# creates two things for you from that declaration:
A private delegate field to serve as the backing
storage for the event
The actual event along with
implementation code that makes use
of the delegate.
Conveniently, both of these have the same name.  That's why the sample code will work for your own events.
However, you can't rely on this to be the case when using events implemented by other libraries.  In particular, the events in Windows Forms and in WPF don't have their own backing storage, so the sample code will not work for them.