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