Вы можете заключить выражение в лямбду, а затем скомпилировать и оценить его. Это дало бы вам ценность независимо от того, какое это выражение.
string myvalue = Expression.Lambda<Func<string>>(bin.Right).Compile().Invoke();
Обратите внимание, что это не сработает, если параметр c используется в правой части выражения, поскольку он не будет определен. Также обратите внимание, что это даст вам текущее значение с правой стороны при вызове Invoke, и последующие вызовы могут возвращать разные значения, если поле в объекте изменяется.
Обновление: если вы не знаете тип правой части во время компиляции, вы можете использовать объект, но это сломается для типов значений, таких как int. Вам нужно будет использовать Expression.Convert для принудительной упаковки типов значений перед их возвратом. Это будет работать как для типов значений, так и для ссылочных типов:
object myvalue = Expression.Lambda<Func<object>>(
Expression.Convert(bin.Right, typeof(object))).Compile().Invoke();
Вы также можете использовать нетипизированную лямбду и DynamicInvoke:
object myvalue = Expression.Lambda(bin.Right).Compile().DynamicInvoke();