GetCurrentMethod and lambdas - watch out

Got bit by this a few moments ago... Thankfully it didn't take long, but probably because this was fairly isolated in my case; I could imagine getting stuck for a bit longer if this were a larger piece of code.

Anyway, I was running method that goes through a array and looks for a reference to the method itself, using MethodBase.GetCurrentMethod. I had the following code.

public void AnInterestingMethod()
{
  var result = Thingy.ListInterestingMethods(this.GetType().Assembly);
  Assert.IsTrue(result.Any(method => method == MethodBase.GetCurrentMethod()));
  ...

And yet I wasn't finding a match. After looking at this for a bit, I realized that of course the GetCurrentMethod call won't execute in this method, but in the lambda, with its own anonymous function.

The following rewrite shows finds the method as expected.

public void AnInterestingMethod()
{
var result = Thingy.ListInterestingMethods(this.GetType().Assembly);
MethodBase m = MethodBase.GetCurrentMethod();
Assert.IsTrue(result.Any(method => method == m));
...

Now the GetCurrentMethod call executes in the interesting method itself, which of course makes it show up in the list.

Enjoy!