public override IMessage Invoke(IMessage msg)
        {
            var methodCall = (IMethodCallMessage)msg;
            var method     = (MethodInfo)methodCall.MethodBase;

            var isSetMethod = method.Name.StartsWith("set_");

            object result = null;

            if (isSetMethod)
            {
                var propertyName = method.Name.Replace("set_", "");
                var propertyInfo = typeof(T).GetProperties()
                                   .First(p => p.Name == propertyName);

                var valueBefore = propertyInfo.GetValue(_instance, null);

                result = method.Invoke(_instance, methodCall.InArgs);

                var valueAfter = propertyInfo.GetValue(_instance, null);

                if (valueBefore != valueAfter)
                {
                    _list.NotifyItemChanged(_instance, propertyName);
                }
            }
            else if (method.Name == "FieldSetter")
            {
                var fieldName = methodCall.Args[1].ToString();
                var newValue  = methodCall.Args[2];
                var fieldInfo = typeof(T).GetFields()
                                .First(f => f.Name == fieldName);

                var valueBefore = fieldInfo.GetValue(_instance);

                result = method.Invoke(_instance, methodCall.InArgs);

                // Seems like we need to manually set the value using reflection (method.Invoke isn't doing anything here)
                fieldInfo.SetValue(_instance, newValue);

                if ((valueBefore == null && newValue != null) || !valueBefore.Equals(newValue))
                {
                    _list.NotifyItemChanged(_instance, fieldName);
                }
            }
            else
            {
                result = method.Invoke(_instance, methodCall.InArgs);
            }

            return(new ReturnMessage(result, null, 0, methodCall.LogicalCallContext, methodCall));
        }