diff --git a/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs b/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs index 7a67744444..dd4c9f0811 100644 --- a/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs +++ b/src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs @@ -35,6 +35,7 @@ private static string GeneratePartialClass(INamedTypeSymbol classSymbol, List<Bl var className = GetClassName(classSymbol); var twoWayParameters = parameters.Where(p => p.IsTwoWayBound).ToArray(); var isBaseTypeComponentBase = classSymbol.BaseType?.ToDisplayString() == "Microsoft.AspNetCore.Components.ComponentBase"; + var doesSupporteParametersViewCache = InheritsFromBitComponentBase(classSymbol); StringBuilder builder = new StringBuilder($@"using System; using System.Threading.Tasks; @@ -62,7 +63,14 @@ public override Task SetParametersAsync(ParameterView parameters) { builder.AppendLine($" {par.PropertySymbol.Name}HasBeenSet = false;"); } - builder.AppendLine(" var parametersDictionary = parameters.ToDictionary() as Dictionary<string, object>;"); + if (doesSupporteParametersViewCache) + { + builder.AppendLine(" var parametersDictionary = (ParametersCache ??= parameters.ToDictionary() as Dictionary<string, object>);"); + } + else + { + builder.AppendLine(" var parametersDictionary = parameters.ToDictionary() as Dictionary<string, object>;"); + } builder.AppendLine(" foreach (var parameter in parametersDictionary!)"); builder.AppendLine(" {"); builder.AppendLine(" switch (parameter.Key)"); @@ -117,7 +125,14 @@ public override Task SetParametersAsync(ParameterView parameters) } else { - builder.AppendLine(" return base.SetParametersAsync(ParameterView.FromDictionary(parametersDictionary as IDictionary<string, object?>));"); + if (doesSupporteParametersViewCache) + { + builder.AppendLine(" return base.SetParametersAsync(ParameterView.Empty);"); + } + else + { + builder.AppendLine(" return base.SetParametersAsync(ParameterView.FromDictionary(parametersDictionary as IDictionary<string, object?>));"); + } } builder.AppendLine(@" }"); @@ -171,4 +186,18 @@ private static string GetClassName(INamedTypeSymbol classSymbol) return sbName.ToString(); } + + private static bool InheritsFromBitComponentBase(INamedTypeSymbol? typeSymbol) + { + if (typeSymbol is null) + return false; + + if (typeSymbol.TypeKind is not TypeKind.Class) + return false; + + if (typeSymbol.Name == "BitComponentBase") + return true; + + return InheritsFromBitComponentBase(typeSymbol.BaseType); + } } diff --git a/src/BlazorUI/Bit.BlazorUI/Components/BitComponentBase.cs b/src/BlazorUI/Bit.BlazorUI/Components/BitComponentBase.cs index c83656cb16..3f496563bf 100644 --- a/src/BlazorUI/Bit.BlazorUI/Components/BitComponentBase.cs +++ b/src/BlazorUI/Bit.BlazorUI/Components/BitComponentBase.cs @@ -74,11 +74,11 @@ public BitDir? Dir [Parameter] public BitVisibility Visibility { get; set; } - + internal protected Dictionary<string, object?>? ParametersCache { get; set; } public override Task SetParametersAsync(ParameterView parameters) { HtmlAttributes.Clear(); - var parametersDictionary = parameters.ToDictionary() as Dictionary<string, object>; + var parametersDictionary = ParametersCache ?? throw new InvalidOperationException(); foreach (var parameter in parametersDictionary!) { switch (parameter.Key) @@ -140,6 +140,9 @@ public override Task SetParametersAsync(ParameterView parameters) break; } } + + ParametersCache = null; + return base.SetParametersAsync(ParameterView.Empty); } diff --git a/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitInputBase.cs b/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitInputBase.cs index 0b16216f6c..4af592ff56 100644 --- a/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitInputBase.cs +++ b/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitInputBase.cs @@ -139,7 +139,7 @@ public override Task SetParametersAsync(ParameterView parameters) { ValueHasBeenSet = false; - var parametersDictionary = parameters.ToDictionary() as Dictionary<string, object>; + var parametersDictionary = (ParametersCache ??= parameters.ToDictionary() as Dictionary<string, object?>); foreach (var parameter in parametersDictionary!) { diff --git a/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitTextInputBase.cs b/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitTextInputBase.cs index b4c4dc61b5..5874799e25 100644 --- a/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitTextInputBase.cs +++ b/src/BlazorUI/Bit.BlazorUI/Components/Inputs/BitTextInputBase.cs @@ -40,7 +40,7 @@ public abstract class BitTextInputBase<TValue> : BitInputBase<TValue> public override Task SetParametersAsync(ParameterView parameters) { - var parametersDictionary = parameters.ToDictionary() as Dictionary<string, object>; + var parametersDictionary = (ParametersCache ??= parameters.ToDictionary() as Dictionary<string, object?>); ; foreach (var parameter in parametersDictionary!) { diff --git a/src/BlazorUI/Bit.BlazorUI/Components/Progress/Loading/Base/BitLoadingBase.cs b/src/BlazorUI/Bit.BlazorUI/Components/Progress/Loading/Base/BitLoadingBase.cs index 5b774859de..fcce59ccf0 100644 --- a/src/BlazorUI/Bit.BlazorUI/Components/Progress/Loading/Base/BitLoadingBase.cs +++ b/src/BlazorUI/Bit.BlazorUI/Components/Progress/Loading/Base/BitLoadingBase.cs @@ -56,7 +56,7 @@ public abstract class BitLoadingBase : BitComponentBase public override Task SetParametersAsync(ParameterView parameters) { - var parametersDictionary = parameters.ToDictionary() as Dictionary<string, object>; + var parametersDictionary = (ParametersCache ??= parameters.ToDictionary() as Dictionary<string, object?>); foreach (var parameter in parametersDictionary!) {