Konvertieren Sie den Linq-Ausdruck "obj => obj.Prop" in "parent => parent.obj.Prop"

Ich habe einen vorhandenen Ausdruck vom TypExpression<Func<T, object>>; es enthält Werte wiecust => cust.Name.

Ich habe auch eine Elternklasse mit einem Feld vom TypT. Ich benötige eine Methode, die das oben genannte als Parameter akzeptiert und einen neuen Ausdruck generiert, der die übergeordnete Klasse TModel) als Parameter. Dies wird als Ausdrucksparameter einer MVC-Methode verwendet.

Thus,cust => cust.Name wirdparent => parent.Customer.Name.

Gleichfalls,cust => cust.Address.State wirdparent => parent.Customer.Address.State.

Hier ist meine erste Version:

    //note: the FieldDefinition object contains the first expression
    //described above, plus the MemberInfo object for the property/field
    //in question
    public Expression<Func<TModel, object>> ExpressionFromField<TModel>(FieldDefinition<T> field)
        where TModel: BaseModel<T>
    {
        var param = Expression.Parameter(typeof(TModel), "t");

        //Note in the next line "nameof(SelectedItem)". This is a reference
        //to the property in TModel that contains the instance from which
        //to retrieve the value. It is unqualified because this method
        //resides within TModel.
        var body = Expression.PropertyOrField(param, nameof(SelectedItem));
        var member = Expression.MakeMemberAccess(body, field.Member);
        return Expression.Lambda<Func<TModel, object>>(member, param);
    }

Der Fehler, den ich derzeit erhalte, ist, wenn ich ein Feld mit mehreren Teilen habe (d. H.cust.Address.State statt nurcust.Name). Ich erhalte eine Fehlermeldung auf demvar member Zeile, in der das angegebene Mitglied nicht existiert - was wahr ist, da sich der Text darauf bezieht, dass das Kind des Elternteils Customer) und nicht das Element, das das Mitglied enthält Address).

Hier ist, was ich wünschte, ich könnte tun:

    public Expression<Func<TModel, object>> ExpressionFromField<TModel>(FieldDefinition<T> field)
        where TModel: BaseModel<T>
    {
        var param = Expression.Parameter(typeof(TModel), "t");
        var body = Expression.PropertyOrField(param, nameof(SelectedItem));
        var IWantThis = Expression.ApplyExpressionToField(field.Expression, body);
        return Expression.Lambda<Func<TModel, object>>(IWantThis, param);
    }

Jede Hilfe zu diesem Punkt wäre sehr dankbar.

Edit: Dies wurde als mögliches Duplikat von @ markierdiese Frag; Die einzige wirkliche Ähnlichkeit ist jedoch die Lösung (die in der Tat dieselbe ist). Das Verfassen von Ausdrücken ist keine intuitive Lösung für den Zugriff auf verschachtelte Eigenschaften über Ausdrücke (es sei denn, die Benutzerführung basiert auf bestimmten Erfahrungen, die nicht vorausgesetzt werden sollten). Ich habe auch die Frage bearbeitet und festgestellt, dass die Lösung für einen Parameter einer MVC-Methode geeignet sein muss, wodurch die möglichen Lösungen eingeschränkt werden.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage