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();