Voglio una singola classe generica in grado di accettare sia i tipi di riferimento che quelli di valore e eseguire solo un'azione basata su un test di uguaglianza. considerare quanto segue:Vincoli generici: Posso testare l'uguaglianza di generico che può essere un riferimento o un tipo di valore?
public class Property<TProp>
where TProp : struct, IEquatable<TProp>
{
public TProp Value;
public void SetValue(ObservableObject owner, TProp value)
{
if (!Value.Equals(value)) // cannot use != on struct constrained TProp
{
// ... set the property
}
}
}
public class ByRefProperty<TProp>
where TProp : class // Dont want to require IEquatable<> on reference type TProp
{
public TProp Value;
public void SetValue(ObservableObject owner, TProp value)
{
if (Value != value)
{
// ... set the property
}
}
}
Sto dover utilizzare i vincoli generici e due classi per essere in grado di testare tipo di valore dell'uguaglianza vs uguaglianza tipo di riferimento. C'è un modo per aggirare questo in modo che finisca con una sola classe?
Non voglio particolarmente una soluzione che coinvolga i tipi di valore di boxing, utilizzando la riflessione o la generazione di IL di runtime. C'è una soluzione semplice che ho perso qui?
Verrà utilizzato qualsiasi logica Equals personalizzata definita nell'implementazione di 'IEquatable'? –
@Justin, sì, se il tipo lo implementa. –
@Jon - Impara qualcosa di nuovo ogni giorno ... di nuovo. –