File: System\ComponentModel\Design\Serialization\ExpressionTable.cs
Web Access
Project: src\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;
    }
}