2016-09-20 2 views
1

Ich habe die folgende Methode wurde verwendet, um Einstellung bestimmter Eigenschaften zu null, die großen Werke:Linq Expression - Set verschachtelte Eigenschaft Werte

public static void Detach<TObject>(TObject parentObj, params Expression<Func<TObject, object>>[] detachEntities) 
    { 
     foreach (var detachEntity in detachEntities) 
     { 
      var prop = (PropertyInfo)((MemberExpression)detachEntity.Body).Member; 
      prop.SetValue(parentObj, null); 
     } 
    } 

die Methode aufzurufen, die ich benutze: Detach(personObj, x => x.Car) - ziemlich einfach

Aber ich versuche folgendes zu tun:

Detach(personObj, x => x.Car.Make); 

-oder

Detach(personObj, x => x.Dogs.Select(s => s.Breed), x => x.Car.Make); 

Also ich versuche, jede Eigenschaft in den Ausdruck zu bekommen und setzen Sie den Wert auf null.

Jede Hilfe wäre willkommen. Danke!

Antwort

1

Okay, so könnte dies nicht perfekt sein, aber es funktioniert - ich bin offen für Verbesserungen:

public static void Detach<TObject>(TObject parentObj, params Expression<Func<TObject, object>>[] detachEntities) 
     { 
      foreach (var detachEntity in detachEntities) 
      { 
       var methodCallExpression = detachEntity.Body as MethodCallExpression; 
       var member = methodCallExpression?.Arguments[0] as MemberExpression; 
       PropertyInfo prop; 
       if (member != null) 
       { 
        prop = (PropertyInfo)member.Member; 
        prop.SetValue(parentObj, null); 
       } 

       var memberExpression = detachEntity.Body as MemberExpression; 
       var expression = memberExpression?.Expression as MemberExpression;     

       switch (memberExpression?.Expression.NodeType) 
       { 
        case ExpressionType.Parameter: 
         prop = (PropertyInfo)memberExpression.Member; 
         prop.SetValue(parentObj, null); 
         break; 
        case ExpressionType.MemberAccess: 
         if (expression != null) 
         { 
          prop = (PropertyInfo)expression.Member; 
          prop.SetValue(parentObj, null); 
         } 
         break; 
       }    
      } 
     } 
Verwandte Themen