Non sono a conoscenza di nessuna libreria , ma è possibile scrivere la propria abbastanza facilmente.
Ecco una base Ho bussato in pochi minuti che stabilisce due dati modo vincolante tra due proprietà semplici:
public static class Binder
{
public static void Bind(
INotifyPropertyChanged source,
string sourcePropertyName,
INotifyPropertyChanged target,
string targetPropertyName)
{
var sourceProperty
= source.GetType().GetProperty(sourcePropertyName);
var targetProperty
= target.GetType().GetProperty(targetPropertyName);
source.PropertyChanged +=
(s, a) =>
{
var sourceValue = sourceProperty.GetValue(source, null);
var targetValue = targetProperty.GetValue(target, null);
if (!Object.Equals(sourceValue, targetValue))
{
targetProperty.SetValue(target, sourceValue, null);
}
};
target.PropertyChanged +=
(s, a) =>
{
var sourceValue = sourceProperty.GetValue(source, null);
var targetValue = targetProperty.GetValue(target, null);
if (!Object.Equals(sourceValue, targetValue))
{
sourceProperty.SetValue(source, targetValue, null);
}
};
}
}
Naturalmente, questo codice manca un paio di sottigliezze. Cose da aggiungere sono
- Verifica che
source
e target
sono assegnati
- Verifica che le proprietà identificate da
sourcePropertyName
e targetPropertyName
esistono
- Verifica per digitare la compatibilità tra le due proprietà
Inoltre, Riflessione è relativamente lento (benchmark prima di scartarlo, non è che lento), quindi potresti voler usare compilato espressioni invece.
Infine, dato che la specificazione delle proprietà per stringa è soggetta a errore, è possibile utilizzare invece espressioni di Linq e metodi di estensione. Poi invece di scrivere
Binder.Bind(source, "Name", target, "Name")
si potrebbe scrivere
source.Bind(Name => target.Name);
realtà stavo chiedendo perché mi stava prendendo in considerazione scrivere il mio. Non volevo reinventare la ruota e tutto ... grazie. Aggiornamento –
: ho collegato alla mia biblioteca nella domanda. –
Avevo bisogno di una semplice classe di calcolo dati barebone per il mio progetto corrente-in-a-hurry, e quello sopra quasi si adatta a ciò di cui ho bisogno. Ho appena sostituito i nomi di proprietà usati con Reflection da due delegati di Action in cui ottengo/set dal POCO e applico le trasformazioni e la formattazione. Darò sicuramente una buona prova a Truss in un prossimo progetto, perché suona davvero molto interessante per me. – Larry