2010-08-07 7 views
2

Je le code suivanttransformer une expression lambda

Expression<Func<IPersistentAttributeInfo, bool>> expression = info => info.Owner== null; 

et que vous voulez Tranform à

Expression<Func<PersistentAttributeInfo, bool>> expression = info => info.Owner== null; 

PersistentAttributeInfo est connu que lors de l'exécution si

Est-il possible?

Répondre

4

Si PersistentAttributeInfo est uniquement connu au moment de l'exécution, il est évident que vous ne pouvez pas écrire le lambda de façon statique et que le compilateur doit effectuer la lourde tâche pour vous. Vous devrez créer un nouveau à partir de zéro:

Type persistentAttributeInfoType = [TypeYouKnowAtRuntime]; 
ParameterExpression parameter = Expression.Parameter(persistentAttributeInfoType, "info"); 
LambdaExpression lambda = Expression.Lambda(
    typeof(Func<,>).MakeGenericType(persistentAttributeInfoType, typeof(bool)), 
    Expression.Equal(Expression.Property(parameter, "Owner"), Expression.Constant(null)), 
    parameter); 

Vous pouvez appeler lambda.Compile() pour renvoyer un délégué qui est analogue à l'expression lambda transformé dans votre exemple (même si bien sûr typées).

+0

Impressionnant travail ... J'ai joué avec lui pendant environ 20 minutes et a abandonné ... –

Questions connexes