Quindi, sono un po 'fuori dalla mia zona di comfort quando si tratta di Func <>, Generics e lambda, ma penso di avere l'idea generale (sorta di) ma ancora un po' confusa.C# Func <> e generics
Ho implementato la classe SortableObservableCollection (tratto da on-line da qualche parte - grazie a chiunque fosse l'ho presa da!) Ed è utilizzata in questo modo:
_lookuplistViewModel.Sort(x => x.BrandName, ListSortDirection.Ascending);
dove x è il tipo di oggetto implementato da la collezione ordinabile. In questo caso, BrandName è una proprietà del tipo di oggetto implementato, ma voglio usare il codice sopra in una classe generica e passare la proprietà su cui ordinare. Il metodo Sort assomiglia a questo:
public void Sort<TKey>(Func<T, TKey> keySelector, ListSortDirection direction)
{
switch (direction)
{
case ListSortDirection.Ascending:
{
ApplySort(Items.OrderBy(keySelector));
break;
}
case System.ComponentModel.ListSortDirection.Descending:
{
ApplySort(Items.OrderByDescending(keySelector));
break;
}
}
}
La classe generica su cui il metodo Sort viene chiamato è definita in questo modo:
public class ExtendedLookupManagerViewModel<VMod, Mod> : LookupManagerViewModel
where VMod : ExtendedLookupViewModel
where Mod : ExtendedLookupModelBase
e mi piacerebbe creare un'istanza in questo modo:
_medProd = new ExtendedLookupManagerViewModel<MedicinalProductViewModel, MedicinalProduct>(string property);
dove property
è la proprietà su cui ordinare. Idealmente questo dovrebbe essere sicuro, ma una stringa sarà sufficiente.
Qualcuno può aiutarmi a orientarmi nella direzione giusta per favore?
Sono abbastanza bene con lambda e generici, ma non riesco a capire cosa lo chiedi, la prima riga di codice che hai pubblicato fa quello che stai chiedendo dalla tua descrizione dei requisiti, ma il tuo sig costruttore non sembra avere nulla a che fare con ciò di cui stai parlando. Sono molto confuso. Qual è la tua raccolta di ciò che stai cercando di ordinare? –
Hai perfettamente ragione, la prima linea funziona ma solo se utilizzo un tipo specifico derivato da ExtendedLookupManagerViewModel piuttosto che usare i generici. BrandName è una proprietà su MedicinalProductViewModel, ma se uso un altro tipo devo essere in grado di utilizzare un'altra proprietà. La domanda credo sia come posso usare un parametro passato invece di x.BrandName.Spero che lo renda un po 'più chiaro? – pilsdumps