Пример #1
0
        public void Test()
        {
            var typeGraph = new TypeGraph <IBase>(GetType().Assembly.GetTypes());

            var pathBuilder = new PathBuilder <IBase>(typeGraph);

            var result = pathBuilder.Find(new ClassA(), typeof(IE));

            //// 1) IA.B -> IB.C -> IC.D -> ID.E
            ////                             |-> IE.BaseE
            ////                                    |-> IE.BaseE ...
            ////                                    |-> IE.DerivedE ...
            ////                             |-> IE.DerivedE
            ////                                    |-> IE.BaseE ...
            ////                                    |-> IE.DerivedE ...
            ////
            //// 2) IBaseA.A
            ////        |-> IBaseA.A ...
            ////        |-> IA.B -> IB.C -> IC.D -> ID.E ...

            var ab       = typeof(IA).GetProperty("B");
            var bc       = typeof(IB).GetProperty("C");
            var cd       = typeof(IC).GetProperty("D");
            var de       = typeof(ID).GetProperty("E");
            var baseaA   = typeof(IBaseA).GetProperty("A");
            var eBase    = typeof(IE).GetProperty("BaseE");
            var eDerived = typeof(IE).GetProperty("DerivedE");

            var vertexABCDE = new CompositPropertyVertex();

            vertexABCDE.PropertyList.AddLast(ab);
            vertexABCDE.PropertyList.AddLast(bc);
            vertexABCDE.PropertyList.AddLast(cd);
            vertexABCDE.PropertyList.AddLast(de);
            var vertexBaseAA = new CompositPropertyVertex();

            vertexBaseAA.PropertyList.AddLast(baseaA);
            var vertexEBaseE = new CompositPropertyVertex();

            vertexEBaseE.PropertyList.AddLast(eBase);
            var vertexEDerivedE = new CompositPropertyVertex();

            vertexEDerivedE.PropertyList.AddLast(eDerived);

            vertexABCDE.Children.AddLast(vertexEBaseE);
            vertexABCDE.Children.AddLast(vertexEDerivedE);

            vertexEBaseE.Children.AddLast(vertexEBaseE);
            vertexEBaseE.Children.AddLast(vertexEDerivedE);

            vertexEDerivedE.Children.AddLast(vertexEBaseE);
            vertexEDerivedE.Children.AddLast(vertexEDerivedE);

            vertexBaseAA.Children.AddLast(vertexABCDE);
            vertexBaseAA.Children.AddLast(vertexBaseAA);

            var expected = new[] { vertexABCDE, vertexBaseAA };

            Assert.True(IsEqual(expected, result));
        }
Пример #2
0
        public void Test()
        {
            var typeGraph = new TypeGraph <IBase>(GetType().Assembly.GetTypes());

            var pathBuilder = new PathBuilder <IBase>(typeGraph);

            var result = pathBuilder.Find(new A(), typeof(IF));

            var ab = typeof(IA).GetProperty("B");
            var ac = typeof(IA).GetProperty("C");
            var bc = typeof(IB).GetProperty("C");
            var cf = typeof(IC).GetProperty("F");

            var pathCommon = new CompositPropertyVertex();

            pathCommon.PropertyList.AddLast(cf);

            var path1 = new CompositPropertyVertex();

            path1.PropertyList.AddLast(ab);
            path1.PropertyList.AddLast(bc);
            path1.Children.AddLast(pathCommon);

            var path2 = new CompositPropertyVertex();

            path2.PropertyList.AddLast(ac);
            path2.Children.AddLast(pathCommon);

            var expected = new[] { path1, path2 };

            Assert.True(IsEqual(expected, result));
        }
Пример #3
0
        public void Test()
        {
            var typeGraph = new TypeGraph <IBase>(GetType().Assembly.GetTypes());

            var pathBuilder = new PathBuilder <IBase>(typeGraph);

            var result = pathBuilder.Find(new A(), typeof(IB));

            var ab = typeof(IA).GetProperty("ListB");

            var vertex1 = new CompositPropertyVertex();

            vertex1.PropertyList.AddLast(ab);

            var expected = new[] { vertex1 };

            Assert.True(IsEqual(expected, result));
        }
Пример #4
0
        public void Test()
        {
            var typeGraph = new TypeGraph <IBase>(GetType().Assembly.GetTypes());

            var pathBuilder = new PathBuilder <IBase>(typeGraph);

            var result = pathBuilder.Find(new A(), typeof(ID));

            var ab = typeof(IA).GetProperty("Base");
            var bc = typeof(IB).GetProperty("Base");
            var cd = typeof(IC).GetProperty("Base");

            var vertexAB = new CompositPropertyVertex();

            vertexAB.PropertyList.AddLast(ab);

            var vertexBC = new CompositPropertyVertex();

            vertexBC.PropertyList.AddLast(bc);

            var vertexCD = new CompositPropertyVertex();

            vertexCD.PropertyList.AddLast(cd);

            vertexAB.Children.AddLast(vertexAB);
            vertexAB.Children.AddLast(vertexBC);
            vertexAB.Children.AddLast(vertexCD);

            vertexBC.Children.AddLast(vertexAB);
            vertexBC.Children.AddLast(vertexBC);
            vertexBC.Children.AddLast(vertexCD);

            vertexCD.Children.AddLast(vertexAB);
            vertexCD.Children.AddLast(vertexBC);
            vertexCD.Children.AddLast(vertexCD);

            var expected = new[] { vertexAB };

            Assert.True(IsEqual(expected, result));
        }
Пример #5
0
        public void Test()
        {
            var typeGraph = new TypeGraph <IBase>(GetType().Assembly.GetTypes());

            var pathBuilder = new PathBuilder <IBase>(typeGraph);

            var result = pathBuilder.Find(new A(), typeof(ID));

            var ab  = typeof(IA).GetProperty("B");
            var bc  = typeof(IB).GetProperty("C");
            var cd1 = typeof(IC).GetProperty("D1");
            var cd2 = typeof(IC).GetProperty("D2");
            var cd3 = typeof(IC).GetProperty("D3");

            var cd1Vertex = new CompositPropertyVertex();

            cd1Vertex.PropertyList.AddLast(cd1);

            var cd2Vertex = new CompositPropertyVertex();

            cd2Vertex.PropertyList.AddLast(cd2);

            var cd3Vertex = new CompositPropertyVertex();

            cd3Vertex.PropertyList.AddLast(cd3);

            var startVertex = new CompositPropertyVertex();

            startVertex.PropertyList.AddLast(ab);
            startVertex.PropertyList.AddLast(bc);
            startVertex.Children.AddRange(new[] { cd1Vertex, cd2Vertex, cd3Vertex });

            var expected = new[] { startVertex };

            Assert.True(IsEqual(expected, result));
        }
Пример #6
0
        private static void CreateDelegate(CompositPropertyVertex vertex,
                                           Dictionary <CompositPropertyVertex, ProxyDelegate <TSearch, TResult> > delegateMap,
                                           SearchStrategy <TSearch, TResult> strategy)
        {
            if (vertex.PropertyList.First == null)
            {
                throw new NullReferenceException();
            }

            if (delegateMap.ContainsKey(vertex))
            {
                return;
            }

            var propertyGetters = new Func <object, object> [vertex.PropertyList.Count];

            var parameter = Expression.Parameter(typeof(object), "obj");
            var nullConst = Expression.Constant(null);

            var hasCollection = false;

            var index = 0;

            vertex.PropertyList.ForEach(
                node =>
            {
                if (typeof(ICollection).IsAssignableFrom(node.Value.PropertyType))
                {
                    hasCollection = true;
                }

                var resultVariable = Expression.Variable(typeof(object), "result");

                var castVariable = Expression.Variable(node.Value.DeclaringType, "value");
                var castAs       = Expression.TypeAs(parameter, node.Value.DeclaringType);
                var castAssign   = Expression.Assign(castVariable, castAs);

                var checkNotNull = Expression.NotEqual(castVariable, nullConst);
                var memberAccess = Expression.Convert(Expression.MakeMemberAccess(castVariable, node.Value),
                                                      typeof(object));
                var conditionalMemberAccess = Expression.Condition(checkNotNull, memberAccess, nullConst);

                var resultAssign = Expression.Assign(resultVariable, conditionalMemberAccess);

                var returnTarget = Expression.Label(typeof(object));
                var returnLabel  = Expression.Label(returnTarget, nullConst);
                var returnExpr   = Expression.Return(returnTarget, resultVariable);

                var block = Expression.Block(typeof(object), new[] { castVariable, resultVariable }, castAssign,
                                             resultAssign, returnExpr, returnLabel);

                var deleg = Expression.Lambda <Func <object, object> >(block, parameter).Compile();

                propertyGetters[index++] = deleg;
            });

            var childDelegates = new ProxyDelegate <TSearch, TResult> [vertex.Children.Count];

            delegateMap[vertex] = new ProxyDelegate <TSearch, TResult>(propertyGetters, childDelegates, strategy,
                                                                       hasCollection);

            index = 0;
            vertex.Children.ForEach(
                node =>
            {
                CreateDelegate(node.Value, delegateMap, strategy);
                childDelegates[index++] = delegateMap[node.Value];
            });
        }