2016-09-20 6 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; 
       }    
      } 
     } 
関連する問題