| File: System\ComponentModel\Design\Serialization\ExpressionTable.cs | Web Access |
| Project: src\winforms\src\System.Windows.Forms.Design\src\System.Windows.Forms.Design.csproj (System.Windows.Forms.Design) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.CodeDom; namespace System.ComponentModel.Design.Serialization; /// <summary> /// An expression table allows a lookup from expression to object and object to expression. /// It is similar to the serialization manager's GetName and GetInstance methods, /// only with rich code expressions. /// </summary> internal sealed class ExpressionTable { private Dictionary<object, ExpressionInfo>? _expressions; internal void SetExpression(object value, CodeExpression expression, bool isPreset) { _expressions ??= new(new ReferenceComparer()); _expressions[value] = new ExpressionInfo(expression, isPreset); } internal CodeExpression? GetExpression(object value) => _expressions is not null && _expressions.TryGetValue(value, out ExpressionInfo? info) ? info.Expression : null; internal bool ContainsPresetExpression(object value) => _expressions is not null && _expressions.TryGetValue(value, out ExpressionInfo? info) && info.IsPreset; private class ExpressionInfo { internal ExpressionInfo(CodeExpression expression, bool isPreset) { Expression = expression; IsPreset = isPreset; } internal CodeExpression Expression { get; } internal bool IsPreset { get; } } private class ReferenceComparer : IEqualityComparer<object> { bool IEqualityComparer<object>.Equals(object? x, object? y) => ReferenceEquals(x, y); int IEqualityComparer<object>.GetHashCode(object? x) => x is not null ? x.GetHashCode() : 0; } }