反思 – 获取属性名称

我想在不使用魔术字符串的情况下将属性名称传递给函数。

就像是:

Get(x=>x.Property1); 

其中Property1是ObjectType类型的属性。

方法实现会是什么样的?

这可以使用表达式来实现:

 // requires object instance, but you can skip specifying T static string GetPropertyName(Expression> exp) { return (((MemberExpression)(exp.Body)).Member).Name; } // requires explicit specification of both object type and property type static string GetPropertyName(Expression> exp) { // extract property name return (((MemberExpression)(exp.Body)).Member).Name; } // requires explicit specification of object type static string GetPropertyName(Expression> exp) { var body = exp.Body; var convertExpression = body as UnaryExpression; if(convertExpression != null) { if(convertExpression.NodeType != ExpressionType.Convert) { throw new ArgumentException("Invalid property expression.", "exp"); } body = convertExpression.Operand; } return ((MemberExpression)body).Member.Name; } 

用法:

 var x = new ObjectType(); // note that in this case we don't need to specify types of x and Property1 var propName1 = GetPropertyName(() => x.Property1); // assumes Property2 is an int property var propName2 = GetPropertyName(y => y.Property2); // requires only object type var propName3 = GetPropertyName(y => y.Property3); 

更新:修复了返回值类型的属性的GetPropertyName(Expression> exp)

 class Foo { public string Bar { get; set; } } class Program { static void Main() { var result = Get(x => x.Bar); Console.WriteLine(result); } static string Get(Expression> expression) { var me = expression.Body as MemberExpression; if (me != null) { return me.Member.Name; } return null; } }