我试图从MemberExpression获取一个子属性的MemberInfo。我已经找到了获取嵌套类型的全名的方法,但没有办法获得嵌套类型的整个MemberInfo。以下是我正在谈论的场景的一个简单示例:
一些简单模型(目标是最终获取Child类的Data属性的MemberInfo)
public class Parent
{
public int ParentProperty { get; set; }
public Child Child { get; set; }
}
public class Child
{
public string Data { get; set; }
}
lambda表达式
Expression<Func<Parent,string>> func = new Func<Parent, string>(p =>
{
return p.Child.Data;
});
用于从lambda表达式获取MemberInfo的代码。
internal static MemberInfo FindMemberInfoFromLambda(LambdaExpression lambda)
{
var expression = (Expression) lambda;
var flag = false;
while (!flag)
{
switch (expression.NodeType)
{
case ExpressionType.Convert:
expression = ((UnaryExpression) expression).Operand;
continue;
case ExpressionType.Lambda:
expression = ((LambdaExpression) expression).Body;
continue;
case ExpressionType.MemberAccess:
var memberExpression = (MemberExpression) expression;
if (memberExpression.Expression.NodeType == ExpressionType.Parameter ||
memberExpression.Expression.NodeType == ExpressionType.Convert)
return memberExpression.Member;
throw new Exception();
default:
flag = true;
continue;
}
}
throw new Exception();
}
如果我试图获取Parent类的ParentProperty,这段代码效果很好,但是当我尝试获取Child类的Data属性的MemberInfo时,它不起作用。我已经看到在获取子属性的全名时发布了一些StackOverflow问题,但没有获取整个MemberInfo的问题。有没有人以前这样做过,或者可以帮助我指出正确的方向?
答案 0 :(得分:0)
您必须使用Expression而不仅仅是Func
在MemberAccess部分的代码中,您正在检查该成员是否来自参数,在本例中为Parent。如果您删除该检查,那么您将获得数据
的成员更改此部分
case ExpressionType.MemberAccess:
var memberExpression = (MemberExpression) expression;
if (memberExpression.Expression.NodeType == ExpressionType.Parameter ||
memberExpression.Expression.NodeType == ExpressionType.Convert)
return memberExpression.Member;
throw new Exception();
到
case ExpressionType.MemberAccess:
var memberExpression = (MemberExpression) expression;
return memberExpression.Member;
我不知道为什么你有这个参数的保护,如果你在某些情况下需要它,那么你可以创建一个不同的方法或传入一个参数。
答案 1 :(得分:0)
你得到的表达式是MemberExpression,你可以直接获取它的会员属性:
class Program
{
class Parent
{
public int A { get; set; }
public Child Child { get; set; }
}
class Child
{
public string Data { get; set; }
}
public static MemberInfo GetMemberInfo(LambdaExpression exp)
{
var body = exp.Body as MemberExpression;
return body.Member;
}
static void Main(string[] args)
{
Expression<Func<Parent, string>> func1 = p => p.Child.Data;
Console.WriteLine(GetMemberInfo(func1));
Expression<Func<Parent, int>> func2 = p => p.A;
Console.WriteLine(GetMemberInfo(func2));
}
}
输出:
System.String Data
Int32 A