2010-07-08 17 views
0

J'ai des difficultés à faire fonctionner cette API dans .net 3.5 (fonctionne bien dans 4.0). Fondamentalement, j'ai le code suivantAPI Dynamic Expression (Dynamic.cs) Pas correctement l'analyse de l'expression dans .net 3.5

List<ParameterExpression> parameters = new List<ParameterExpression>(); 
    parameters.Add(Expression.Parameter(typeof(double), "R0C6")); 
    parameters.Add(Expression.Parameter(typeof(double), "R0C7")); 
    parameters.Add(Expression.Parameter(typeof(double), "R0C8")); 
    parameters.Add(Expression.Parameter(typeof(double), "R0C9")); 
    parameters.Add(Expression.Parameter(typeof(double), "R0C10")); 
    parameters.Add(Expression.Parameter(typeof(double), "R0C11")); 
    parameters.Add(Expression.Parameter(typeof(double), "R0C12")); 

    LambdaExpression e = DynamicExpressionBuilder.ParseLambda(
       parameters.ToArray(), typeof(double), "R0C6 + R0C7 + R0C8 + R0C9 + R0C10 + R0C11 + R0C12"); 

    var result = e.Compile().DynamicInvoke(1, 1, 1, 1, 1, 1, 1); 
    Console.WriteLine(result); 

Lors de l'exécution de ce code, j'obtiens ArgumentException. La raison étant .NET 3.5 n'a pas de délégué Func qui prend plus de 4 paramètres. Quelqu'un peut-il me suggérer de changer dans Dynamic.cs afin que je puisse obtenir du code capable de fonctionner en 3.5?

+0

Pouvez-vous expliquer ce que fait DynamicExpressionBuilder avec les paramètres? Ma réponse ci-dessous suppose que vous avez un ensemble statique de paramètres, mais après l'avoir relu, je vois que dans la pratique, vous avez probablement affaire à un nombre inconnu de paramètres. –

+0

DynamicExpressionBuilder est simplement la version renommée de DynamicExpression de classe dans le fichier Dynamic.cs. Je viens de changer de nom afin que je puisse différencier DynamicExpression de classe dans l'espace de noms system.linq.expression. – Bhavesh

Répondre

0

Y a-t-il une raison pour laquelle vous ne pouvez pas combiner tous les doubles dans un seul objet de paramètre qui contient des champs ou des propriétés pour les valeurs? Alors vous auriez seulement besoin d'un paramètre dans votre Func pour l'expression.

1

Oui c'est une alternative. Voici le code qui a fonctionné pour moi

 List<ParameterExpression> parameters = new List<ParameterExpression>(); 
     parameters.Add(Expression.Parameter(typeof(Holder), "H")); 


     LambdaExpression e = DynamicExpressionBuilder.ParseLambda(parameters.ToArray(), typeof(double), "H.R0C6 + H.R0C7 + H.R0C8 + H.R0C9 + H.R0C10 + H.R0C11 + H.R0C12"); 

     var result = e.Compile().DynamicInvoke(new Holder { R0C6 = 1, R0C7 = 1, R0C8 = 1, R0C9 = 1, R0C10 = 1, R0C11 = 1, R0C12 = 1 }); 
     Console.WriteLine(result); 

Mais sûrement il devrait y avoir une meilleure façon de réaliser mon implémentation originale.