2016-09-20 120 views
1

我一直用下面的方法來某些屬性設置爲null,偉大的工程組嵌套的屬性值:LINQ表達式

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); 
     } 
    } 

要調用的方法,我用:Detach(personObj, x => x.Car) - 很簡單

但我想做到以下幾點:

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

- 或 -

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

因此,我試圖在表達式中獲取每個屬性,並將其值設置爲null

任何援助將不勝感激。 謝謝!

回答

1

好了,所以這可能不是完美的,但它的工作 - 我願意接受任何的改進:

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; 
       }    
      } 
     }