2011-07-19 4 views
2

J'ai une expression Lambda qui est une fonction qui fonctionne un peu dans un contexte précédent. Par conséquent, je devrai cloner cet objet et reporter l'expression dans le nouveau contexte, mais je crains que des valeurs locales ne soient transférées dans la nouvelle expression. J'ai fait un effort pour recevoir des paramètres dans l'expression et éviter les valeurs locales des objets, donc j'espère que cela est réduit au minimum. Cependant, ma question est: est-il possible de cloner une expression et de faire en sorte que sa sortie compilée honore les nouvelles valeurs locales de l'objet et non les anciennes?Clonage C# incluant l'expression Lambda

Je peux illustrer si cette image de mot n'était pas assez descriptive.

Je fonctionne sous l'hypothèse de base qu'à un certain niveau les mêmes règles d'expression Lambda sont en vigueur. Autrement dit, comment les expressions Lambda reconnaissent les variables locales au contexte de l'expression.

Merci ...

+0

Il serait utile si vous ajoutez des codes ... –

+0

Plus de contexte (pseudo code peut-être?) Serait vraiment utile ici. –

Répondre

3

L'expression lambda "règles" font partie du compilateur C# (ou quelle que soit la langue que vous utilisez); l'Expression elle-même n'a pas de connaissance automatique du contexte. Au lieu de cela, si vous « capture » une variable, à savoir x ci-dessous:

int x = ... 
Expression<Func<Foo, bool>> predicate = obj => obj.Bar == x; 

le compilateur crée une instance d'une classe de contexte généré, et utilise ConstantExpression pour l'associer à l'arbre:

// approximate representative code; not literal translation 
var ctx = new SomeContext(); 
ctx.x = ... // x is actually a public instance field of SomeContext 
var param = Expression.Parameter(typeof(Foo), "obj"); 
var predicate = Expression.Lambda<Func<Foo, bool>>(
    Expression.Equal(
     Expression.PropertyOrField(param, "Bar"), 
     Expression.PropertyOrField(Expression.Constant(ctx), "x") 
    ), param); 

Le le seul moyen de "swap" instance de contexte serait de réécrire l'expression entière, généralement via ExpressionVisitor. Notez également que les étendues imbriquées peuvent conduire à des scénarios plus complexes impliquant des objets de contexte chaînés.

Personnellement; Je doute que tu doives t'inquiéter à ce sujet.