2016-09-20 123 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; 
       }    
      } 
     }