In uno script precedente (https://www.aspitalia.com/script/1371/Realizzare-Oggetto-DataList-Generico-Blazor.aspx) abbiamo visto un possibile utilizzo della direttiva TypeParam in Blazor per rendere i nostri componenti generici.
Purtroppo, nell'attuale sintassi di Razor, questa direttiva non supporta type constraint, cosa che ci impedisce di restringere il campo dei possibili tipi da utilizzare. Fortunatamente esiste un workaround tramite l'utilizzo di partial class.
Immaginiamo per esempio di voler creare un ComparerComponent che evidenzi, di due valori, quello maggiore:
@typeparam TValue <p> <span class="@(this.First.CompareTo(this.Second) > 0 ? "bg-success font-weight-bold" : string.Empty)"> @this.First </span> - <span class="@(this.Second.CompareTo(this.First) > 0 ? "bg-success font-weight-bold" : string.Empty)"> @this.Second </span></p> @code { [Parameter] public TValue First { get; set; } [Parameter] public TValue Second { get; set; } }
Come possiamo notare, abbiamo dichiarato un generico TypeParam TValue e abbiamo due proprietà First e Second di questo tipo. Per confrontare i valori ed evidenziare la maggiore, abbiamo sfruttato il metodo CompareTo, che appartiene all'interfaccia IComparable<T>. Pertanto dobbiamo inserire un vincolo su TValue che implementi questa interfaccia.
Come già accennato, la soluzione è creare un file ComparerComponent.razor.cs in cui definire la partial class seguente:
public partial class ComparerComponent<TValue> where TValue : IComparable<TValue> { }
A questo punto, possiamo utilizzare il componente con un gran numero di tipi differenti, come mostrato nel codice in basso:
<ComparerComponent TValue="int" First="3" Second="5"></ComparerComponent> <ComparerComponent TValue="string" First="@("Mario")" Second="@("Gianni")"></ComparerComponent> <ComparerComponent TValue="DateTime" First="@DateTime.Now" Second="@DateTime.Now.AddDays(-1)" />
Se proviamo però a referenziare un TValue che non rispetti il constraint, come per esempio la classe Stream, otterremo un errore di compilazione:
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Miglioramenti agli screen reader e al contrasto in Angular
Effettuare il binding di date in Blazor
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Reactive form tipizzati con FormBuilder in Angular
Generare file per il download da Blazor WebAssembly
Definire stili a livello di libreria in Angular
C# 12: Cosa c'è di nuovo e interessante
Come EF 8 ha ottimizzato le query che usano il metodo Contains
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Sfruttare lo streaming di una chiamata Http da Blazor
Sfruttare al massimo i topic space di Event Grid MQTT
I più letti di oggi
- annunciato #netstandard 2.1. .NET Core lo supporterà a partire da #netcore3, così come le prossime versione di #xamarin, #mono e #unity.il supporto per #netfx 4.8, invece, non ci sarà. https://aspit.co/bq2
- Steel Style CheckBox per Silverlight 4.0
- Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core
- Speciale Windows Store app: costruire app con WinRT per Windows 8