using System;
using System.Linq .Expressions ;
using System.Reflection ;
public class Test
{
private object Foo { get; }
private object Bar { get; }
static void MyMethod( params Expression< Func< Test, object>> [ ] fields) {
foreach ( var fieldExpr in fields) {
var finder = new Finder( "Foo" ) ;
finder.Visit ( fieldExpr) ;
if ( finder.IsFound ) {
Console.WriteLine ( "Expression {0} reference 'Foo'" , fieldExpr) ;
} else {
Console.WriteLine ( "Expression {0} does not reference 'Foo'" , fieldExpr) ;
}
}
}
static void Main( string[ ] args) {
MyMethod( e => e.Foo , e => e.Bar , e => e.Bar != null ? e.Foo : e.Bar ) ;
}
}
internal class Finder : ExpressionVisitor {
private readonly string toFind;
public Finder( string toFind) {
this.toFind = toFind;
}
public bool IsFound { get; private set; }
protected override Expression VisitMember( MemberExpression node) {
IsFound |= node.Member .MemberType == MemberTypes.Property && node.Member .Name == toFind;
return base.VisitMember ( node) ;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucS5FeHByZXNzaW9uczsKdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247CgpwdWJsaWMgY2xhc3MgVGVzdAp7CiAgICAgICAgcHJpdmF0ZSBvYmplY3QgRm9vIHsgZ2V0OyB9CiAgICAgICAgcHJpdmF0ZSBvYmplY3QgQmFyIHsgZ2V0OyB9CgogICAgICAgIHN0YXRpYyB2b2lkIE15TWV0aG9kKHBhcmFtcyBFeHByZXNzaW9uPEZ1bmM8VGVzdCxvYmplY3Q+PltdIGZpZWxkcykgewogICAgICAgICAgICBmb3JlYWNoICh2YXIgZmllbGRFeHByIGluIGZpZWxkcykgewogICAgICAgICAgICAgICAgdmFyIGZpbmRlciA9IG5ldyBGaW5kZXIoIkZvbyIpOwogICAgICAgICAgICAgICAgZmluZGVyLlZpc2l0KGZpZWxkRXhwcik7CiAgICAgICAgICAgICAgICBpZiAoZmluZGVyLklzRm91bmQpIHsKICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhwcmVzc2lvbiB7MH0gcmVmZXJlbmNlICdGb28nIiwgZmllbGRFeHByKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4cHJlc3Npb24gezB9IGRvZXMgbm90IHJlZmVyZW5jZSAnRm9vJyIsIGZpZWxkRXhwcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykgewogICAgICAgICAgICBNeU1ldGhvZChlID0+IGUuRm9vLCBlID0+IGUuQmFyLCBlID0+IGUuQmFyICE9IG51bGwgPyBlLkZvbyA6IGUuQmFyKTsKICAgICAgICB9Cn0KCgogICAgaW50ZXJuYWwgY2xhc3MgRmluZGVyIDogRXhwcmVzc2lvblZpc2l0b3IgewogICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIHRvRmluZDsKCiAgICAgICAgcHVibGljIEZpbmRlcihzdHJpbmcgdG9GaW5kKSB7CiAgICAgICAgICAgIHRoaXMudG9GaW5kID0gdG9GaW5kOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGJvb2wgSXNGb3VuZCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KCiAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEV4cHJlc3Npb24gVmlzaXRNZW1iZXIoTWVtYmVyRXhwcmVzc2lvbiBub2RlKSB7CiAgICAgICAgICAgIElzRm91bmQgfD0gbm9kZS5NZW1iZXIuTWVtYmVyVHlwZSA9PSBNZW1iZXJUeXBlcy5Qcm9wZXJ0eSAmJiBub2RlLk1lbWJlci5OYW1lID09IHRvRmluZDsKICAgICAgICAgICAgcmV0dXJuIGJhc2UuVmlzaXRNZW1iZXIobm9kZSk7CiAgICAgICAgfQogICAgfQo=