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); } } }
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); }
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); }