C# 通过 ()=>obj.Property 的形式获取实例和属性名

在利用反射编程的时候,我们有时候往往需要通过对象的属性来获取属性名和其对象,例 ()=>obj.Property。这样做的好处是:属性名称不再是字符串,而是直接从属性名获取,方便后期维护。

正文

实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static Tuple<object, MemberInfo> GetFieldInfoAndInstance<T>(Expression<Func<T>> lambdaExpression)
{
// 获取 memberInfo
MemberExpression memberExpression = (!(lambdaExpression.Body is UnaryExpression expression)) ? ((MemberExpression)lambdaExpression.Body) : ((MemberExpression)expression.Operand);
MemberInfo memberInfo = memberExpression.Member;

// 获取实例
MemberExpression instanceMemberInfoExp = memberExpression.Expression as MemberExpression;
FieldInfo instanceFieldInfo = instanceMemberInfoExp.Member as FieldInfo;
var classInstanceExp = instanceMemberInfoExp.Expression as ConstantExpression;
var instance = instanceFieldInfo.GetValue(classInstanceExp.Value);

return new Tuple<object, MemberInfo>(instance, memberInfo);
}

使用代码

1
2
3
4
5
// student 是一个学生定义,此处不展示代码
var student = new Student();
// result 第一个值为 student 对象
// result 第二个值为 student 中 Name 相关信息,通过它就可以获取 Name 的名称
Tuple<object, FieldInfo> result = TestExpression.GetFieldInfoAndInstance(() => student.Name);

参考

  1. How can I get object instance from ()=>foo.Title expression