Exemplo n.º 1
0
 protected void AddMemberAttributePin(MemberInfo member, IEnumerable <Type> desiredattrtypes)
 {
     foreach (var attrtype in desiredattrtypes)
     {
         Attribute[] validattrs;
         try
         {
             validattrs = member.GetCustomAttributes(attrtype, true).Cast <Attribute>().ToArray();
         }
         catch (Exception e)
         {
             continue;
         }
         if (validattrs.Length == 0)
         {
             continue;
         }
         var pin = Pd.AddOutput(TransformType(attrtype, member), new OutputAttribute(member.Name + " " + attrtype.GetCSharpName())
         {
             Visibility = PinVisibility.OnlyInspector
         });
         pin.Spread.SliceCount = validattrs.Length;
         for (int i = 0; i < validattrs.Length; i++)
         {
             pin[i] = TransformOutput(validattrs[i], member, i);
         }
     }
 }
Exemplo n.º 2
0
        protected void AddMemberPin(MemberInfo member)
        {
            if (!AllowMember(member))
            {
                return;
            }
            var oattr = MemberAttributeHandler <OutputAttribute>(member);

            Type memberType = typeof(object);

            switch (member)
            {
            case FieldInfo field:
                memberType = field.FieldType;
                break;

            case PropertyInfo prop:
                memberType = prop.PropertyType;
                break;
            }
            var enumerable    = false;
            var dictionary    = false;
            var allowEnumconv = AllowEnumBinsizing(member, memberType);

            GetEnumerableGenerics(member, memberType, out var potentialGenDictT, out var potentialGenEnumT);

            if (allowEnumconv && potentialGenDictT != null)
            {
                var stype = potentialGenDictT.GenericTypeArguments;
                oattr.Name          = member.Name + " Values";
                oattr.BinVisibility = oattr.Visibility == PinVisibility.OnlyInspector
                    ? PinVisibility.OnlyInspector
                    : PinVisibility.Hidden;

                var kattr = (OutputAttribute)oattr.Clone();
                kattr.Name          = member.Name + " Keys";
                kattr.BinVisibility = PinVisibility.OnlyInspector;
                Pd.AddOutput(TransformType(stype[0], member), kattr, binSized: true);
                Pd.AddOutput(TransformType(stype[1], member), oattr, binSized: true);
                dictionary = true;
            }
            else if (allowEnumconv && potentialGenEnumT != null)
            {
                var stype = potentialGenEnumT.GenericTypeArguments[0];
                oattr.BinVisibility = oattr.Visibility == PinVisibility.OnlyInspector
                    ? PinVisibility.OnlyInspector
                    : PinVisibility.Hidden;
                Pd.AddOutput(TransformType(stype, member), oattr, binSized: true);
                enumerable = true;
            }
            else
            {
                Pd.AddOutput(TransformType(memberType, member), oattr);
                enumerable = false;
            }
            AddMemberAttributePin(member);
            IsMemberEnumerable.Add(member, enumerable);
            IsMemberDictionary.Add(member, dictionary);
        }
Exemplo n.º 3
0
        private void AddMemberPin(MemberInfo member)
        {
            if (!(member is FieldInfo) && !(member is PropertyInfo))
            {
                return;
            }
            Type memberType = typeof(object);

            switch (member)
            {
            case FieldInfo field:
                if (field.IsStatic)
                {
                    return;
                }
                if (field.FieldType.IsPointer)
                {
                    return;
                }
                if (!field.FieldType.IsPublic && !FExposePrivate[0])
                {
                    return;
                }

                memberType = field.FieldType;
                break;

            case PropertyInfo prop:
                if (!prop.CanRead)
                {
                    return;
                }
                if (prop.PropertyType.IsPointer)
                {
                    return;
                }
                if (prop.GetIndexParameters().Length > 0)
                {
                    return;
                }

                memberType = prop.PropertyType;
                break;
            }
            var enumerable = false;

            if ((memberType.GetInterface("IEnumerable") != null) && (memberType != typeof(string)))
            {
                try
                {
                    var interfaces = memberType.GetInterfaces().ToList();
                    interfaces.Add(memberType);
                    var stype = interfaces
                                .Where(type =>
                    {
                        try
                        {
                            var res = type.GetGenericTypeDefinition();
                            if (res == null)
                            {
                                return(false);
                            }
                            return(res == typeof(IEnumerable <>));
                        }
                        catch (Exception)
                        {
                            return(false);
                        }
                    })
                                .First().GenericTypeArguments[0];
                    Pd.AddOutput(TransformType(stype, member), new OutputAttribute(member.Name), binSized: true);
                    enumerable = true;
                }
                catch (Exception)
                {
                    Pd.AddOutput(TransformType(memberType, member), new OutputAttribute(member.Name));
                    enumerable = false;
                }
            }
            else
            {
                Pd.AddOutput(TransformType(memberType, member), new OutputAttribute(member.Name));
                enumerable = false;
            }
            IsMemberEnumerable.Add(member, enumerable);
        }