C#表达式-提取字符串名称(深)

C#表达式-提取字符串名称(深),c#,expression,C#,Expression,我有下面的函数,当我调用它时返回“Test”GetPropertyName(x=>x.Test) 如何返回深度呼叫,例如:User.UserName。 我想在调用GetPropertyName(x=>x.User.FullName)时看到User.UserName 谢谢 public static string GetPropertyName<T>(Expression<Func<T, object>> expression) { var body =

我有下面的函数,当我调用它时返回“Test”
GetPropertyName(x=>x.Test)

如何返回深度呼叫,例如:User.UserName。
我想在调用
GetPropertyName(x=>x.User.FullName)时看到
User.UserName

谢谢

public static string GetPropertyName<T>(Expression<Func<T, object>> expression)
{
    var body = expression.Body as MemberExpression;
    if (body == null)
    {
        body = ((UnaryExpression)expression.Body).Operand as MemberExpression;
    }
    if (body != null)
    {
        return body.Member.Name;
    }
    return null;
}

此方法循环表达式中的节点,将节点强制转换为属性并将其添加到列表中

private IList<PropertyInfo> GetProperties<T>(Expression<Func<T, object>> fullExpression)
{
    Expression expression;
    switch (fullExpression.Body.NodeType)
    {
        case ExpressionType.Convert:
        case ExpressionType.ConvertChecked:
            var ue = fullExpression.Body as UnaryExpression;
            expression = ((ue != null) ? ue.Operand : null) as MemberExpression;
            break;
        default:
            expression = fullExpression.Body as MemberExpression;
            break;
    }

    var props = new List<PropertyInfo>();

    while(expression != null && expression.NodeType == ExpressionType.MemberAccess)
    {
        var memberExp = expression as MemberExpression;

        if(memberExp.Member is FieldInfo)
            throw InvalidExpressionException.FieldFound;

        var prop = memberExp.Member as PropertyInfo;
        props.Insert(0, prop);

        expression = memberExp.Expression;
    }
    return props;
}

您的代码有一些多余的内容,只不过是以下内容:
if(body==null){body=((UnaryExpression)expression.body).operation as MemberExpression;}返回body.Member.Name谢谢,但无法编译您的方法。这是我的输入:
Expression
我想我不能使用:
Expression
我的错,我忘了在签名中包含
Func
。再次。。。对不起,我弄错了。在函数
表达式中。NodeType
是Convert。会不会是因为会员都是虚拟人?感谢您试图传递的表达式是什么?“强制转换或转换操作,例如C#中的(SampleType)obj”来自
private IList<PropertyInfo> GetProperties<T>(Expression<Func<T, object>> fullExpression)
{
    Expression expression;
    switch (fullExpression.Body.NodeType)
    {
        case ExpressionType.Convert:
        case ExpressionType.ConvertChecked:
            var ue = fullExpression.Body as UnaryExpression;
            expression = ((ue != null) ? ue.Operand : null) as MemberExpression;
            break;
        default:
            expression = fullExpression.Body as MemberExpression;
            break;
    }

    var props = new List<PropertyInfo>();

    while(expression != null && expression.NodeType == ExpressionType.MemberAccess)
    {
        var memberExp = expression as MemberExpression;

        if(memberExp.Member is FieldInfo)
            throw InvalidExpressionException.FieldFound;

        var prop = memberExp.Member as PropertyInfo;
        props.Insert(0, prop);

        expression = memberExp.Expression;
    }
    return props;
}
var props = GetProperties<Model>(m => m.User.Username);
var propNames = props.Select(p => p.Name);
string names = string.Join(".", propNames);