Asignar propiedad con un árbol de expresión

Estoy jugando con la idea de pasar una asignación de propiedad a un método como un árbol de expresión. El método invocaría la expresión para que la propiedad se asigne correctamente, y luego olfatearía el nombre de la propiedad que se acaba de asignar para que pueda generar el evento PropertyChanged. La idea es que me gustaría poder usar propiedades automáticas delgadas en mis ViewModels WPF y todavía tener el evento PropertyChanged activado.

Soy un ignorante con ExpressionTrees, así que espero que alguien pueda señalarme en la dirección correcta:

public class ViewModelBase {
    public event Action<string> PropertyChanged = delegate { };

    public int Value { get; set; }

    public void RunAndRaise(MemberAssignment Exp) {
        Expression.Invoke(Exp.Expression);
        PropertyChanged(Exp.Member.Name);
    }
}

El problema es que no estoy seguro de cómo llamar a esto. Este ingenuo intento fue rechazado por el compilador por razones que estoy seguro será obvio para cualquiera que pueda responder esto:

        ViewModelBase vm = new ViewModelBase();

        vm.RunAndRaise(() => vm.Value = 1);

EDITA

Gracias @svick por la respuesta perfecta. Moví una cosita y lo convertí en un método de extensión. Aquí está el ejemplo de código completo con prueba unitaria:

[TestClass]
public class UnitTest1 {
    [TestMethod]
    public void TestMethod1() {
        MyViewModel vm = new MyViewModel();
        bool ValuePropertyRaised = false;
        vm.PropertyChanged += (s, e) => ValuePropertyRaised = e.PropertyName == "Value";

        vm.SetValue(v => v.Value, 1);

        Assert.AreEqual(1, vm.Value);
        Assert.IsTrue(ValuePropertyRaised);
    }
}


public class ViewModelBase : INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    public void OnPropertyChanged(string propertyName) {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class MyViewModel : ViewModelBase {
    public int Value { get; set; }
}

public static class ViewModelBaseExtension {
    public static void SetValue<TViewModel, TProperty>(this TViewModel vm, Expression<Func<TViewModel, TProperty>> exp, TProperty value) where TViewModel : ViewModelBase {
        var propertyInfo = (PropertyInfo)((MemberExpression)exp.Body).Member;
        propertyInfo.SetValue(vm, value, null);
        vm.OnPropertyChanged(propertyInfo.Name);
    }
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta