Obtendo Valores de ExpressionTrees

deixe estar:

Expression<Func> expression = c => c.Name == "John"; 

Agora eu recebo o valor usando:

 string myvalue = ((ConstantExpression) bin.Right).Value; 

Agora vamos lá:

 string x = "John"; Expression<Func> expression = c => c.Name == x; 

agora eu entendo isso

 string myvalue = ((ConstantExpression) bin.Right).Value; 

geraria um erro porque o bin.right aqui não é constante expressão é uma expressão de campo, mas a questão é como faço para obter o valor (John) fora disso?

Você poderia envolver a expressão em um lambda e, em seguida, compilá-lo e avaliá-lo. Isso lhe daria o valor, não importa que tipo de expressão seja.

 string myvalue = Expression.Lambda>(bin.Right).Compile().Invoke(); 

Observe que isso não funcionará se o parâmetro c for usado no lado direito da expressão, uma vez que não seria definido. Observe também que isso fornecerá o valor atual do lado direito quando você chamar Invoke e as chamadas subseqüentes poderão retornar valores diferentes se o campo no object for alterado.


Update: Se você não sabe o tipo do lado direito em tempo de compilation, você pode usar o object, mas isso vai quebrar para tipos de valor como int. Você precisará usar o Expression.Convert para forçar os tipos de valor a serem encheckboxdos antes de devolvê-los. Isso funcionará para os tipos de valor e tipos de referência:

 object myvalue = Expression.Lambda>( Expression.Convert(bin.Right, typeof(object))).Compile().Invoke(); 

Você também pode usar um lambda sem tipo e DynamicInvoke:

 object myvalue = Expression.Lambda(bin.Right).Compile().DynamicInvoke();