@using MudBlazor @using System.Reflection @if (_isSimpleType) { @RenderEditor(ItemType, _workingValue, v => _workingValue = v, "Value") } else { @foreach (var prop in _properties) { var p = prop; var currentVal = p.GetValue(_workingValue); @RenderEditor(p.PropertyType, currentVal, v => p.SetValue(_workingValue, v), p.Name) } } Cancel OK @code { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; [Parameter] public Type ItemType { get; set; } = null!; [Parameter] public object? InitialValue { get; set; } private object? _workingValue; private bool _isSimpleType; private PropertyInfo[] _properties = Array.Empty(); protected override void OnParametersSet() { _isSimpleType = ItemType.IsValueType || ItemType == typeof(string) || ItemType.IsEnum; _workingValue = InitialValue; if (!_isSimpleType && _workingValue != null) { _properties = ItemType.GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(p => p.CanRead && p.CanWrite) .ToArray(); } } private RenderFragment RenderEditor(Type type, object? value, Action onChanged, string label) => builder => { builder.OpenElement(0, "div"); builder.AddAttribute(1, "class", "settings-field"); if (type == typeof(bool)) { var boolVal = (bool)(value ?? false); builder.OpenComponent>(2); builder.AddAttribute(3, "Value", boolVal); builder.AddAttribute(4, "ValueChanged", EventCallback.Factory.Create(this, v => { onChanged(v); StateHasChanged(); })); builder.AddAttribute(5, "Label", label); builder.AddAttribute(6, "Color", Color.Primary); builder.CloseComponent(); } else if (type == typeof(int)) { var intVal = value is int iv ? iv : 0; builder.OpenComponent>(2); builder.AddAttribute(3, "Value", intVal); builder.AddAttribute(4, "ValueChanged", EventCallback.Factory.Create(this, v => { onChanged(v); StateHasChanged(); })); builder.AddAttribute(5, "Label", label); builder.AddAttribute(6, "Variant", Variant.Outlined); builder.CloseComponent(); } else if (type == typeof(double)) { var dblVal = value is double dv ? dv : 0.0; builder.OpenComponent>(2); builder.AddAttribute(3, "Value", dblVal); builder.AddAttribute(4, "ValueChanged", EventCallback.Factory.Create(this, v => { onChanged(v); StateHasChanged(); })); builder.AddAttribute(5, "Label", label); builder.AddAttribute(6, "Variant", Variant.Outlined); builder.CloseComponent(); } else if (type.IsEnum) { builder.OpenComponent>(2); builder.AddAttribute(3, "Value", value); builder.AddAttribute(4, "ValueChanged", EventCallback.Factory.Create(this, v => { onChanged(v); StateHasChanged(); })); builder.AddAttribute(5, "Label", label); builder.AddAttribute(6, "Variant", Variant.Outlined); builder.AddAttribute(7, "ChildContent", (RenderFragment)(innerBuilder => { foreach (var enumVal in Enum.GetValues(type)) { innerBuilder.OpenComponent>(0); innerBuilder.AddAttribute(1, "Value", enumVal); innerBuilder.AddAttribute(2, "ChildContent", (RenderFragment)(b => b.AddContent(0, enumVal.ToString()))); innerBuilder.CloseComponent(); } })); builder.CloseComponent(); } else { var strVal = value?.ToString() ?? ""; builder.OpenComponent>(2); builder.AddAttribute(3, "Value", strVal); builder.AddAttribute(4, "ValueChanged", EventCallback.Factory.Create(this, v => { onChanged(v); StateHasChanged(); })); builder.AddAttribute(5, "Label", label); builder.AddAttribute(6, "Variant", Variant.Outlined); builder.CloseComponent(); } builder.CloseElement(); }; private void Ok() => MudDialog.Close(DialogResult.Ok(_workingValue)); private void Cancel() => MudDialog.Cancel(); }