Beispiel #1
0
        private static string GetLabel(MethodUmlMember member)
        {
            var argsCollection = member.Method.GetParameters()
                                 .Select(a => a.Name);
            var args = string.Join(", ", argsCollection);

            return($"{member.Name}({args})");
        }
        public void Visit(UmlDiagram diagram, UmlEntity info)
        {
            var type = info.Type;

            var properties = ScanProperties(type, ScanFlags);

            info.Members.AddRange(properties);

            var r = BindingFlags.Public | BindingFlags.NonPublic;

            if (ScanFlags.HasFlag(ReflectionFlags.InstanceMethod))
            {
                r |= BindingFlags.Instance;
            }
            if (ScanFlags.HasFlag(ReflectionFlags.StaticMethod))
            {
                r |= BindingFlags.Static;
            }

            var methodInfos = type.GetMethods(r);

            {
                var h = SortAndPrepareMethods;
                if (h != null)
                {
                    var args = new SortAndPrepareMethodsEventArgs {
                        Methods = methodInfos
                    };
                    h.Invoke(this, args);
                    methodInfos = args.Methods;
                }
            }
            foreach (var mi in methodInfos)
            {
                var add  = CheckSkipDefault(mi);
                var flag = GetMFlag(mi, ReflectionFlags.PublicMethod, ReflectionFlags.ProtectedMethod,
                                    ReflectionFlags.PrivateMethod);
                if (add)
                {
                    if (!H(flag, ScanFlags))
                    {
                        add = false;
                    }
                }

                var h = AddTypeToDiagram;
                if (h is null && !add)
                {
                    continue;
                }

                var member = new MethodUmlMember
                {
                    Group      = 20,
                    Name       = mi.Name,
                    Method     = mi,
                    Visibility = GetVisibilityFromFlags(flag)
                };
                if (mi.IsAbstract)
                {
                    member.Kind = UmlMemberKind.Abstract;
                }
                if (mi.IsStatic)
                {
                    member.Kind = UmlMemberKind.Static;
                }

                if (h != null)
                {
                    var args = new AddTypeToDiagramEventArgs
                    {
                        Decision  = add ? AddDecision.Add : AddDecision.Skip,
                        Member    = mi,
                        UmlMember = member
                    };
                    h(this, args);
                    if (args.Decision != AddDecision.Default)
                    {
                        add = args.Decision == AddDecision.Add;
                    }
                }

                if (!add)
                {
                    continue;
                }

                info.Members.Add(member);
            }
        }
Beispiel #3
0
        private static IEnumerable <Type> ProcessMethod(UmlDiagram diagram, UmlEntity diagClass, MethodUmlMember member)
        {
            if (diagClass.Type != member.Method.DeclaringType)
            {
                if (diagram.ContainsType(diagClass.Type.BaseType.MeOrGeneric()))
                {
                    member.HideOnList = true;
                    yield break;
                }
            }

            var att = member.Method.GetCustomAttribute <UmlRelationAttribute>();

            if (att == null)
            {
                yield break;
            }

            var ti = new TypeExInfo(att.RelatedType ?? member.Method.ReturnType, att.DoNotResolveCollections);

            if (!diagram.ContainsType(ti.ElementType))
            {
                yield break;
            }
            // create relation

            member.HideOnList = true;

            var          owner          = diagClass.Type;
            var          component      = ti.ElementType;
            const string ownerLabel     = "";
            const string componentLabel = "";

            var arrow = UmlRelationArrow.MkArrow(att, GetMultiplicity(att.Multiple, ti.IsCollection));

            if (att.ForceAddToDiagram)
            {
                yield return(ti.ElementType);
            }

            var rel = new UmlRelation
            {
                Left  = new UmlRelationEnd(diagram.GetTypeName(owner), ownerLabel),
                Right = new UmlRelationEnd(diagram.GetTypeName(component), componentLabel),
                Arrow = arrow,
                Label = string.IsNullOrEmpty(att.Name) ? GetLabel(member) : att.Name
            }
            .WithNote(att)
            .WitCreatorMeta <MemberToRelationVisitor>(owner, component);

            rel.Tag        = att.Tag;
            rel.BaseMember = member;

            diagram.Relations.Add(rel);
        }