Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Code cleanup & comments.

  • Loading branch information...
commit 7d86f2025d6a7d614aac199bc11f5a3600ef4078 1 parent 5156aaa
Martin Konicek mkonicek authored
Showing with 62 additions and 143 deletions.
  1. +0 −1  src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.csproj
  2. +22 −22 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Drawing/PositionedGraphNodeControl.xaml.cs
  3. +3 −4 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/PositionedNode.cs
  4. +1 −1  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/Box.cs
  5. +2 −1  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/Edge.cs
  6. +1 −1  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/EdgeRouter.cs
  7. +6 −6 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/GeomUtils.cs
  8. +2 −3 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/IEdge.cs
  9. +1 −1  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/IPoint.cs
  10. +2 −1  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/IRect.cs
  11. +1 −1  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/Point2D.cs
  12. +1 −1  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/RouteGraph/EdgeStartEnd.cs
  13. +11 −5 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/RouteGraph/RouteGraph.cs
  14. +1 −1  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/RouteGraph/RouteGraphEdge.cs
  15. +4 −1 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/RouteGraph/RouteVertex.cs
  16. +1 −1  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/RouteGraph/RoutedEdge.cs
  17. +1 −1  ...s/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/ShortestPath/DijkstraShortestPathFinder.cs
  18. +0 −49 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/NodeControlCache.cs
  19. +0 −14 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/ObjectGraphControl.xaml.cs
  20. +0 −1  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/ObjectGraphWindow.xaml.cs
  21. +0 −5 src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs
  22. +2 −22 src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ObjectValue.cs
1  src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.csproj
View
@@ -254,7 +254,6 @@
<Compile Include="Visualizers\Graph\Layout\TreeModel\ContentNode.cs" />
<Compile Include="Visualizers\Graph\Layout\TreeModel\ContentNodeEventArgs.cs" />
<Compile Include="Visualizers\Graph\Layout\TreeModel\ContentPropertyNode.cs" />
- <Compile Include="Visualizers\Graph\NodeControlCache.cs" />
<Compile Include="Visualizers\Graph\ObjectGraphControl.xaml.cs">
<DependentUpon>ObjectGraphControl.xaml</DependentUpon>
<SubType>Code</SubType>
44 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Drawing/PositionedGraphNodeControl.xaml.cs
View
@@ -72,28 +72,6 @@ public void SetDataContext(PositionedNode node)
this.listView.ItemsSource = new VirtualizingObservableCollection<ContentNode>(this.items);
}
- public void CalculateWidthHeight()
- {
- if (!IsShowMemberIcon) {
- columnMemberIcon.Width = 0;
- }
-
- int nameColumnMaxLen = this.items.MaxOrDefault(contentNode => contentNode.Name.Length, 0);
- GridView gv = listView.View as GridView;
- columnName.Width = Math.Min(20 + nameColumnMaxLen * 6, 260);
- columnText.Width = 80;
- listView.Width = columnExpander.Width + columnMemberIcon.Width + columnName.Width + columnText.Width + 10;
-
- int maxItems = 10;
- listView.Height = 4 + Math.Min(this.items.Count, maxItems) * 20;
- if (this.items.Count > maxItems) {
- listView.Width += 30; // for scrollbar
- }
-
- this.Width = listView.Width + 2;
- this.Height = listView.Height + this.typeNameHeaderBorder.Height + 2;
- }
-
public PositionedGraphNodeControl()
{
InitializeComponent();
@@ -167,6 +145,28 @@ int SubtreeSize(ContentNode node)
return 1 + node.Children.Sum(child => (child.IsExpanded ? SubtreeSize(child) : 1));
}
+ public void CalculateWidthHeight()
+ {
+ if (!IsShowMemberIcon) {
+ columnMemberIcon.Width = 0;
+ }
+
+ int nameColumnMaxLen = this.items.MaxOrDefault(contentNode => contentNode.Name.Length, 0);
+ GridView gv = listView.View as GridView;
+ columnName.Width = Math.Min(20 + nameColumnMaxLen * 6, 260);
+ columnText.Width = 80;
+ listView.Width = columnExpander.Width + columnMemberIcon.Width + columnName.Width + columnText.Width + 10;
+
+ int maxItems = 10;
+ listView.Height = 4 + Math.Min(this.items.Count, maxItems) * 20;
+ if (this.items.Count > maxItems) {
+ listView.Width += 30; // for scrollbar
+ }
+
+ this.Width = listView.Width + 2;
+ this.Height = listView.Height + this.typeNameHeaderBorder.Height + 2;
+ }
+
#region event helpers
protected virtual void OnPropertyExpanded(PositionedNodeProperty property)
{
7 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/PositionedNode.cs
View
@@ -71,7 +71,7 @@ void InitContentFromObjectNode(Expanded expanded)
void InitVisualControl()
{
- this.NodeVisualControl = NodeControlCache.Instance.GetNodeControl();
+ this.NodeVisualControl = new PositionedGraphNodeControl();
// propagate events from nodeVisualControl
this.NodeVisualControl.PropertyExpanded += new EventHandler<PositionedPropertyEventArgs>(NodeVisualControl_PropertyExpanded);
this.NodeVisualControl.PropertyCollapsed += new EventHandler<PositionedPropertyEventArgs>(NodeVisualControl_PropertyCollapsed);
@@ -87,9 +87,8 @@ public IEnumerable<PositionedNodeProperty> Properties
public virtual IEnumerable<PositionedEdge> Edges
{
get {
- foreach (PositionedNodeProperty property in this.Properties) {
- if (property.Edge != null)
- yield return property.Edge;
+ foreach (PositionedNodeProperty property in this.Properties.Where(prop => prop.Edge != null)) {
+ yield return property.Edge;
}
}
}
2  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/Box.cs
View
@@ -11,7 +11,7 @@
namespace Debugger.AddIn.Visualizers.Graph.SplineRouting
{
/// <summary>
- /// Description of Box.
+ /// Simple implementation of IRect.
/// </summary>
public class Box : IRect, ICloneable
{
3  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/Edge.cs
View
@@ -8,7 +8,8 @@
namespace Debugger.AddIn.Visualizers.Graph.SplineRouting
{
/// <summary>
- /// Description of Edge.
+ /// Simple implementation of <see cref="IEdge" />.
+ /// Edge betweeen two <see cref="IRect" /> with given Start and End point on the borders of the rects.
/// </summary>
public class Edge : IEdge
{
2  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/EdgeRouter.cs
View
@@ -8,7 +8,7 @@
namespace Debugger.AddIn.Visualizers.Graph.SplineRouting
{
/// <summary>
- /// Description of EdgeRouter.
+ /// Entry point to the edge routing algorithm.
/// </summary>
public class EdgeRouter
{
12 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/GeomUtils.cs
View
@@ -38,23 +38,23 @@ public static double LineLenght(IPoint lineStart, IPoint lineEnd)
double right = rect.Left + rect.Width;
double bottom = rect.Top + rect.Height;
- var isectTop = isectHoriz(lineStart, vx, vy, rect.Top, rect.Left, right);
+ var isectTop = IsectHoriz(lineStart, vx, vy, rect.Top, rect.Left, right);
if (isectTop != null)
return isectTop;
- var isectBottom = isectHoriz(lineStart, vx, vy, bottom, rect.Left, right);
+ var isectBottom = IsectHoriz(lineStart, vx, vy, bottom, rect.Left, right);
if (isectBottom != null)
return isectBottom;
- var isectLeft = isectVert(lineStart, vx, vy, rect.Left, rect.Top, bottom);
+ var isectLeft = IsectVert(lineStart, vx, vy, rect.Left, rect.Top, bottom);
if (isectLeft != null)
return isectLeft;
- var isectRight = isectVert(lineStart, vx, vy, right, rect.Top, bottom);
+ var isectRight = IsectVert(lineStart, vx, vy, right, rect.Top, bottom);
if (isectRight != null)
return isectRight;
return null;
}
- static Point2D? isectHoriz(IPoint lineStart, double vx, double vy, double yBound, double left, double right)
+ static Point2D? IsectHoriz(IPoint lineStart, double vx, double vy, double yBound, double left, double right)
{
if (Math.Abs(vy) < eps)
return null;
@@ -68,7 +68,7 @@ public static double LineLenght(IPoint lineStart, IPoint lineEnd)
return null;
}
- static Point2D? isectVert(IPoint lineStart, double vx, double vy, double xBound, double top, double bottom)
+ static Point2D? IsectVert(IPoint lineStart, double vx, double vy, double xBound, double top, double bottom)
{
if (Math.Abs(vx) < eps)
return null;
5 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/IEdge.cs
View
@@ -8,13 +8,12 @@
namespace Debugger.AddIn.Visualizers.Graph.SplineRouting
{
/// <summary>
- /// Enables passing any type of graph (implementing IRect, IEdge) into EdgeRouter.
+ /// Edge in a graph, connecting two <see cref="IRect" />s.
+ /// Enables passing generic graphs <see cref="EdgeRouter />.
/// </summary>
public interface IEdge
{
IRect From { get; }
IRect To { get; }
- //IPoint StartPoint { get; set; }
- //IPoint EndPoint { get; set; }
}
}
2  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/IPoint.cs
View
@@ -8,7 +8,7 @@
namespace Debugger.AddIn.Visualizers.Graph.SplineRouting
{
/// <summary>
- /// Enables passing any type of graph (implementing IRect, IEdge) into EdgeRouter.
+ /// Enables passing generic graphs into EdgeRouter.
/// </summary>
public interface IPoint
{
3  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/IRect.cs
View
@@ -8,7 +8,8 @@
namespace Debugger.AddIn.Visualizers.Graph.SplineRouting
{
/// <summary>
- /// Enables passing any type of graph (implementing IRect, IEdge) into EdgeRouter.
+ /// The node in a graph.
+ /// Enables passing generic graphs <see cref="EdgeRouter />.
/// </summary>
public interface IRect
{
2  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/Point2D.cs
View
@@ -8,7 +8,7 @@
namespace Debugger.AddIn.Visualizers.Graph.SplineRouting
{
/// <summary>
- /// Description of Point2D.
+ /// Simple implementation of <see cref="IPoint" />.
/// </summary>
public struct Point2D : IPoint
{
2  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/RouteGraph/EdgeStartEnd.cs
View
@@ -8,7 +8,7 @@
namespace Debugger.AddIn.Visualizers.Graph.SplineRouting
{
/// <summary>
- /// Description of EdgeStartEnd.
+ /// Pair of Edge start and end point, useful for grouping edges by source & target.
/// </summary>
public class EdgeStartEnd
{
16 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/RouteGraph/RouteGraph.cs
View
@@ -9,7 +9,9 @@
namespace Debugger.AddIn.Visualizers.Graph.SplineRouting
{
/// <summary>
- /// Description of RouteGraph.
+ /// The visibility graph in which <see cref="EdgeRouter" /> searches shortest paths.
+ /// Vertices of the graph are corners of boxes in the original graph.
+ /// Edges connect vertices which can be connected by a line without intersecting boxes.
/// </summary>
public class RouteGraph
{
@@ -35,7 +37,7 @@ public RouteGraph()
}
/// <summary>
- /// Initializes the RouteGraph by vertices close to node corners.
+ /// Initializes the RouteGraph by vertices close to corners of all nodes.
/// </summary>
/// <param name="boundX">X coordinates of vertices cannot be lower than this value (so that edges stay in boundaries).</param>
/// <param name="boundY">Y coordinates of vertices cannot be lower than this value (so that edges stay in boundaries).</param>
@@ -72,6 +74,7 @@ public static RouteGraph InitializeVertices(IEnumerable<IRect> nodes, IEnumerabl
// Here user could provide custom edgeStart and edgeEnd
// inflate boxes a little so that edgeStart and edgeEnd are a little outside of the box (to prevent floating point errors)
if (edge.From == edge.To) {
+ // special case - self edge
var edgeStart = new Point2D(fromRect.Left + fromRect.Width + 0.01, originSourceCurrentY);
var edgeEnd = new Point2D(fromRect.Left + fromRect.Width / 2, fromRect.Top);
graph.AddEdgeEndpointVertices(edge, edgeStart, edgeEnd);
@@ -213,18 +216,21 @@ static EdgeStartEnd GetStartEnd(IEdge edge)
return new EdgeStartEnd { From = edge.From, To = edge.To };
}
- static double GetMultiEdgeSpan(double space, int multiEdgeCount, double multiEdgeGap)
+ /// <summary>
+ /// Calculates space needed for given number of parallel edges coming from one node.
+ /// </summary>
+ static double GetMultiEdgeSpan(double maxSpace, int multiEdgeCount, double multiEdgeGap)
{
if (multiEdgeCount <= 1) {
// 1 edge, no spacing needed
return 0;
}
- if ((multiEdgeCount + 1) * multiEdgeGap < space) {
+ if ((multiEdgeCount + 1) * multiEdgeGap < maxSpace) {
// the edges fit, maintain the gap
return (multiEdgeCount - 1) * multiEdgeGap;
} else {
// there are too many edges, we have to make smaller gaps to fit edges into given space
- return space - multiEdgeGap;
+ return maxSpace - multiEdgeGap;
}
}
}
2  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/RouteGraph/RouteGraphEdge.cs
View
@@ -8,7 +8,7 @@
namespace Debugger.AddIn.Visualizers.Graph.SplineRouting
{
/// <summary>
- /// Edge in the RouteGraph.
+ /// Straight edge in the <see cref="RouteGraph />.
/// </summary>
public class RouteGraphEdge
{
5 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/RouteGraph/RouteVertex.cs
View
@@ -8,7 +8,7 @@
namespace Debugger.AddIn.Visualizers.Graph.SplineRouting
{
/// <summary>
- /// Description of RouteVertex.
+ /// One node in the <see cref="RouteGraph" />, represents a box corner.
/// </summary>
public class RouteVertex : IPoint
{
@@ -41,6 +41,9 @@ public void AddNeighbor(RouteVertex target)
public double Distance { get; set; }
public bool IsPermanent { get; set; }
public RouteVertex Predecessor { get; set; }
+ /// <summary>
+ /// Edge endpoints are not available for routing through them.
+ /// </summary>
public bool IsEdgeEndpoint { get; set; }
public bool IsUsed { get; set; }
public bool IsAvailable { get { return !IsUsed && !IsEdgeEndpoint; } }
2  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/RouteGraph/RoutedEdge.cs
View
@@ -10,7 +10,7 @@
namespace Debugger.AddIn.Visualizers.Graph.SplineRouting
{
/// <summary>
- /// The result of the main method EdgeRouter.RouteEdges(), passed back to the user.
+ /// Polyline in a plane, calculated by <see cref="EdgeRouter.RouteEdges" />, passed back to the user.
/// </summary>
public class RoutedEdge
{
2  ...ebugger/Debugger.AddIn/Visualizers/Graph/Layout/SplineRouting/ShortestPath/DijkstraShortestPathFinder.cs
View
@@ -8,7 +8,7 @@
namespace Debugger.AddIn.Visualizers.Graph.SplineRouting
{
/// <summary>
- /// Description of AStarShortestPathFinder.
+ /// Finds shortest paths in the <see cref="RouteGraph" />.
/// </summary>
public class DijkstraShortestPathFinder
{
49 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/NodeControlCache.cs
View
@@ -1,49 +0,0 @@
-// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
-// This code is distributed under the BSD license (for details please see \src\AddIns\Debugger\Debugger.AddIn\license.txt)
-
-using Debugger.AddIn.Visualizers.Graph.Drawing;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace Debugger.AddIn.Visualizers.Graph
-{
- /// <summary>
- /// Store to reuse <see cref="NodeControl" />s so that they don't have to be created for every drawing.
- /// </summary>
- public class NodeControlCache
- {
- public static readonly NodeControlCache Instance = new NodeControlCache();
-
- private Stack<PositionedGraphNodeControl> controls;
- private int controlsReturned = 0;
-
- private NodeControlCache()
- {
- Clear();
- }
-
- public void ReturnForReuse(PositionedGraphNodeControl controlToReuse)
- {
- // not used now, avoid leaking!
- //controls.Push(controlToReuse);
- }
-
- public PositionedGraphNodeControl GetNodeControl()
- {
- controlsReturned++;
- return new PositionedGraphNodeControl();
- // bugs in drawing
- /*var control = controls.Count == 0 ? new PositionedGraphNodeControl() : controls.Pop();
- control.Init();
- control.InvalidateVisual();
- return control;*/
- }
-
- public void Clear()
- {
- controls = new Stack<PositionedGraphNodeControl>();
- controlsReturned = 0;
- }
- }
-}
14 src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/ObjectGraphControl.xaml.cs
View
@@ -122,14 +122,6 @@ public ICSharpCode.NRefactory.Ast.Expression ShownExpression
}
}
- /// <summary>
- /// ObjectGraph visualizer caches UI controls, this clears the cache.
- /// </summary>
- public void ClearUIControlCache()
- {
- NodeControlCache.Instance.Clear();
- }
-
private void Inspect_Button_Click(object sender, RoutedEventArgs e)
{
this.Refresh();
@@ -144,12 +136,6 @@ ObjectGraph RebuildGraph(string expression)
void LayoutGraph(ObjectGraph graph)
{
- if (this.oldPosGraph != null) {
- foreach (var oldNode in this.oldPosGraph.Nodes) {
- // controls from old graph would be garbage collected, reuse them
- NodeControlCache.Instance.ReturnForReuse(oldNode.NodeVisualControl);
- }
- }
this.oldPosGraph = this.currentPosGraph;
Log.Debug("Debugger visualizer: Calculating graph layout");
var layoutDirection = layoutViewModel.SelectedEnumValue;
1  src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/ObjectGraphWindow.xaml.cs
View
@@ -39,7 +39,6 @@ protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
UnregisterDebuggerEvents();
- this.objectGraphControl.ClearUIControlCache();
ObjectGraphWindow.Instance = null; // allow release
}
5 src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs
View
@@ -130,11 +130,6 @@ public void Refresh()
// Value is IEnumerable
DebugType iEnumerableType, itemType;
if (shownValue.Type.ResolveIEnumerableImplementation(out iEnumerableType, out itemType)) {
- // original
- /*var lazyListViewWrapper = new LazyItemsControl<ObjectValue>(this.listView, initialIEnumerableItemsCount);
- var enumerableValuesProvider = new EnumerableValuesProvider(val.ExpressionTree, iEnumerableType, itemType);
- lazyListViewWrapper.ItemsSource = new VirtualizingIEnumerable<ObjectValue>(enumerableValuesProvider.ItemsSource);
- gridValuesProvider = enumerableValuesProvider;*/
DebugType debugListType;
var debugListExpression = DebuggerHelpers.CreateDebugListExpression(shownExpr, itemType, out debugListType);
gridValuesProvider = CreateListValuesProvider(debugListExpression, itemType);
24 src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ObjectValue.cs
View
@@ -51,7 +51,7 @@ internal ObjectValue(int index, Dictionary<string, MemberInfo> memberFromNameMap
if (memberInfo == null) {
throw new DebuggerVisualizerException("Cannot get member value - no member found with name " + propertyName);
}
- property = createPropertyFromValue(propertyName, this.PermanentReference.GetMemberValue(memberInfo));
+ property = CreatePropertyFromValue(propertyName, this.PermanentReference.GetMemberValue(memberInfo));
this.properties.Add(propertyName, property);
}
return property;
@@ -69,7 +69,7 @@ public static ObjectValue Create(Debugger.Value value, int index, Dictionary<str
return result;
}
- private static ObjectProperty createPropertyFromValue(string propertyName, Value value)
+ private static ObjectProperty CreatePropertyFromValue(string propertyName, Value value)
{
ObjectProperty property = new ObjectProperty();
property.Name = propertyName;
@@ -81,25 +81,5 @@ private static ObjectProperty createPropertyFromValue(string propertyName, Value
property.Value = value.IsNull ? "" : value.InvokeToString();
return property;
}
-
- /*public static ObjectValue Create(Expression expr, DebugType type, BindingFlags bindingFlags)
- {
- ObjectValue result = new ObjectValue();
- foreach(MemberInfo memberInfo in type.GetMembers(bindingFlags))
- {
- Expression memberExpression = expr.AppendMemberReference(memberInfo);
- Value memberValue = memberExpression.Evaluate(WindowsDebugger.CurrentProcess);
-
- ObjectProperty property = new ObjectProperty();
- property.Name = memberInfo.Name;
- property.Expression = memberExpression;
- property.IsAtomic = memberValue.Type.IsPrimitive;
- property.IsNull = memberValue.IsNull;
- property.Value = memberValue.IsNull ? "" : memberValue.InvokeToString();
-
- result.properties.Add(property.Name, property);
- }
- return result;
- }*/
}
}
Please sign in to comment.
Something went wrong with that request. Please try again.