protected virtual void OnMemberWoopsaVisibilityCheck(EventArgsMemberVisibilityCheck e)
 {
     if (MemberWoopsaVisibilityCheck != null)
     {
         MemberWoopsaVisibilityCheck(this, e);
     }
     else if (Owner is WoopsaObjectAdapter)
     {
         ((WoopsaObjectAdapter)Owner).OnMemberWoopsaVisibilityCheck(e);
     }
 }
        protected virtual bool IsMemberWoopsaVisible(object targetObject, MemberInfo memberInfo)
        {
            var  woopsaVisibleAttribute = WoopsaReflection.GetCustomAttribute <WoopsaVisibleAttribute>(memberInfo);
            bool isVisible;
            Type targetType = targetObject.GetType();

            if (woopsaVisibleAttribute != null)
            {
                isVisible = woopsaVisibleAttribute.Visible;
            }
            else
            {
                isVisible = Visibility.HasFlag(WoopsaVisibility.DefaultIsVisible);
            }
            if (isVisible)
            {
                if (memberInfo.DeclaringType != targetType)
                {
                    isVisible = Visibility.HasFlag(WoopsaVisibility.Inherited);
                }
            }
            if (isVisible)
            {
                if (memberInfo.DeclaringType == typeof(object))
                {
                    isVisible = Visibility.HasFlag(WoopsaVisibility.ObjectClassMembers);
                }
            }
            if (isVisible)
            {
                if (memberInfo.DeclaringType == typeof(ArrayList) ||
                    (memberInfo.DeclaringType.IsGenericType &&
                     (memberInfo.DeclaringType.GetGenericTypeDefinition() == typeof(List <>) ||
                      memberInfo.DeclaringType.GetGenericTypeDefinition() == typeof(Collection <>) ||
                      memberInfo.DeclaringType.GetGenericTypeDefinition() == typeof(ObservableCollection <>)))
                    )
                {
                    isVisible = Visibility.HasFlag(WoopsaVisibility.ListClassMembers);
                }
            }
            if (isVisible)
            {
                if (memberInfo is MethodBase)
                {
                    if ((memberInfo as MethodBase).IsSpecialName)
                    {
                        isVisible = Visibility.HasFlag(WoopsaVisibility.MethodSpecialName);
                    }
                }
            }
            if (isVisible)
            {
                if (memberInfo is PropertyInfo)
                {
                    PropertyInfo property = (PropertyInfo)memberInfo;
                    if (typeof(IEnumerable <object>).IsAssignableFrom(property.PropertyType))
                    {
                        isVisible = Visibility.HasFlag(WoopsaVisibility.IEnumerableObject);
                    }
                }
            }
            EventArgsMemberVisibilityCheck e = new EventArgsMemberVisibilityCheck(memberInfo);

            e.IsVisible = isVisible;
            OnMemberWoopsaVisibilityCheck(e);
            isVisible = e.IsVisible;
            return(isVisible);
        }