protected PropertyBindingBase(MemberBindingAttributeBase bindingAttributeBase, MemberInfo memberInfo, object target) : base(bindingAttributeBase, memberInfo, target)
        {
            if (memberInfo.MemberType != MemberTypes.Property)
            {
                ThrowCantCreateBindingForMemberTypeException();
            }

            _propertyInfo = memberInfo.DeclaringType.GetProperty(memberInfo.Name);
        }
        protected BindingBase(MemberBindingAttributeBase bindingAttributeBase, MemberInfo memberInfo, object target)
        {
            MemberInfo = memberInfo;
            Target     = target;
            Group      = bindingAttributeBase.Group;

            var targetType = target.GetType();

            if (!bindingAttributeBase.OnPropertyChanged.IsNullOrEmpty())
            {
                var methodInfo = targetType.GetMethod(bindingAttributeBase.OnPropertyChanged);
                if (methodInfo != null)
                {
                    _onPropertyChanged = () =>
                    {
                        try
                        {
                            methodInfo.Invoke(target, null);
                        }
                        catch (Exception ex)
                        {
                            DebugLogger.Exception(ex);
                        }
                    }
                }
                ;
            }

            if (!bindingAttributeBase.PropertyChangedEventName.IsNullOrEmpty())
            {
                var eventInfo = targetType.GetEvent(bindingAttributeBase.PropertyChangedEventName);
                if (eventInfo != null)
                {
                    eventInfo.AddEventHandler(target, Delegate.CreateDelegate(typeof(Action), this, nameof(OnPropertyChangedByTarget)));
                }
            }
        }