소스 검색

Fixes duplicate class property registration (#19558)

* Fix ClassBindingManager property dictionary insert

* Prepend ClassPropertyPrefix to key when inserting into registered properties dictionary to be consistent with lookup.

* Added ClassBindingManager unit tests
Colton 2 달 전
부모
커밋
934c0f8349
2개의 변경된 파일31개의 추가작업 그리고 4개의 파일을 삭제
  1. 7 4
      src/Avalonia.Base/ClassBindingManager.cs
  2. 24 0
      tests/Avalonia.Base.UnitTests/ClassBindingManagerTests.cs

+ 7 - 4
src/Avalonia.Base/ClassBindingManager.cs

@@ -33,10 +33,13 @@ namespace Avalonia
         }
 
         [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
-        public static AvaloniaProperty GetClassProperty(string className) =>
-            s_RegisteredProperties.TryGetValue(ClassPropertyPrefix + className, out var property)
-                ? property 
-                : s_RegisteredProperties[className] = RegisterClassProxyProperty(className);
+        public static AvaloniaProperty GetClassProperty(string className)
+        {
+            var prefixedClassName = ClassPropertyPrefix + className;
+            return s_RegisteredProperties.TryGetValue(prefixedClassName, out var property)
+                ? property
+                : s_RegisteredProperties[prefixedClassName] = RegisterClassProxyProperty(className);
+        }
 
         [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
         public static bool IsClassesBindingProperty(AvaloniaProperty property, [NotNullWhen(true)] out string? classPropertyName)

+ 24 - 0
tests/Avalonia.Base.UnitTests/ClassBindingManagerTests.cs

@@ -0,0 +1,24 @@
+using Xunit;
+
+namespace Avalonia.Base.UnitTests
+{
+    public class ClassBindingManagerTests
+    {
+
+        [Fact]
+        public void GetClassProperty_Should_Return_Same_Instance_For_Same_Class()
+        {
+            var property1 = ClassBindingManager.GetClassProperty("Foo");
+            var property2 = ClassBindingManager.GetClassProperty("Foo");
+            Assert.Same(property1, property2);
+        }
+
+        [Fact]
+        public void GetClassProperty_Should_Return_Different_Instances_For_Different_Classes()
+        {
+            var property1 = ClassBindingManager.GetClassProperty("Foo");
+            var property2 = ClassBindingManager.GetClassProperty("Bar");
+            Assert.NotSame(property1, property2);
+        }
+    }
+}