ViewModelBase_NoMagicStrings-Failure

CSharp · Console

/Program.cs

using System;
using System.ComponentModel;
using System.Linq.Expressions;

public class ViewModelBase : INotifyPropertyChanged
{
	public event PropertyChangedEventHandler PropertyChanged = delegate {};
	protected void OnPropertyChanged(Expression<Func<object>> expression)
	{
		var f = (Func<object>)Expression.Lambda(expression).Compile().DynamicInvoke();
		
		if (expression == null || !(expression.Body is MemberExpression))
		{
			Console.WriteLine("Failed to notify something was set to \"" + f() + "\" :(");
			return;
		}
		
		PropertyChanged(this, new PropertyChangedEventArgs(((MemberExpression)expression.Body).Member.Name));
		
		Console.WriteLine("Successfully notified change of " + ((MemberExpression)expression.Body).Member.Name + " to \"" + f() + "\"!");
	}
}

public class TestViewModel : ViewModelBase
{
	int _ValueTypedMember;
	public int ValueTypedMember
	{
		get { return _ValueTypedMember; }
		set 
		{
			_ValueTypedMember = value;
			OnPropertyChanged(() => ValueTypedMember);
		}
	}
	
	string _RefTypedMember;
	public string RefTypedMember
	{
		get { return _RefTypedMember; }
		set 
		{
			_RefTypedMember = value;
			OnPropertyChanged(() => RefTypedMember);
		}
	}
}

public class Program
{
	public static void Main()
	{
		var vm = new TestViewModel();
		
		Console.WriteLine("Changing the reference typed member...");
		vm.RefTypedMember = "Hello World";
		
		Console.WriteLine("\nChanging the value typed member...");
		vm.ValueTypedMember = 42;
	}
}
;