2009-09-22 11 views

Répondre

1

Avez-vous essayé d'utiliser Expression.Equal, en spécifiant l'implémentation à utiliser?

En C#:

MethodInfo referenceEquality = typeof(object).GetMethod("ReferenceEquals", 
    BindingFlags.Static | BindingFlags.Public); 
Expression equality = Expression.Equal(lhs, rhs, true, referenceEquality); 

Voici un exemple complet (encore une fois, C# - mais vous devriez être en mesure de traduire facilement):

using System; 
using System.Reflection; 
using System.Linq.Expressions; 

class Test 
{ 
    static void Main() 
    { 
     var lhs = Expression.Parameter(typeof(string), "lhs"); 
     var rhs = Expression.Parameter(typeof(string), "rhs");   
     MethodInfo referenceEquality = typeof(object).GetMethod 
      ("ReferenceEquals", BindingFlags.Static | BindingFlags.Public); 
     var equality = Expression.Equal(lhs, rhs, true, referenceEquality); 
     var lambda = Expression.Lambda<Func<string, string, bool>> 
      (equality, new[] { lhs, rhs }); 

     var compiled = lambda.Compile(); 

     string x = "hello"; 
     string y = x; 
     string z = new string(x.ToCharArray()); 
     Console.WriteLine(compiled(x, y)); // True 
     Console.WriteLine(compiled(x, z)); // False 
    } 
} 
+0

Merci, Jon! C'est une bonne idée! Mais je ne peux pas construire des arbres manuellement. C'est un travail de compilation. Dim exp comme Expression (Of Func (De Chaîne, Chaîne, Booléen)) = Fonction (x, y) x Is y Dans l'arbre ExpressionType de BinaryExpression sera equlas ExpressionType.Equal. –

+0

Je ne comprends pas ce que vous voulez dire - pourquoi ne pouvez-vous pas construire les arbres manuellement? Veuillez donner plus de contexte sur ce que vous essayez d'accomplir. (Notez que dans mon exemple, le type d'expression serait Equal aussi ... cela ne signifie pas qu'il y a quelque chose de mal) –

+0

Je convertis des arbres d'expression en arbres de codedom. Les arbres d'expression créés sont compilateurs. Je ne peux pas construire chaque arbre d'expression à la main, c'est trop complexe. [code] Dim exp comme expression (Of Func (De Chaîne, Chaîne, Booléen)) = Fonction (x, y) x Est-ce que y [/ code] exp - est l'arbre d'expression. Il contient le noeud BinaryExpression qui a la propriété ExpressionType equlas à ExpressionType.Equal bien que j'utilise l'opérateur Is (not =) –

Questions connexes