2010-07-27 27 views
7

Yani, Func >, Generics ve lambda ifadeleri ile uğraşırken, konfor bölgemden biraz uzaktayım ama sanırım genel fikri (çeşit) ama yine de biraz kafam karıştı.C# Func <> ve jenerikler

Ben SortableObservableCollection sınıfı uyguladık

(çevrimiçi bir yerden alınan - ben aldım her kimse sayesinde!) Ve böyle kullanılır:

x nesnesi türü tarafından uygulanan
_lookuplistViewModel.Sort(x => x.BrandName, ListSortDirection.Ascending); 

sortable koleksiyonu. Bu örnekte, BrandName uygulanan nesne türünün bir özelliğidir, ancak yukarıdaki kodu genel bir sınıfta kullanmak ve sıralanacak mülkte geçmek istiyorum. Sıralama yöntemi şöyle görünür:

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; 
     } 
    } 
} 

denir Sıralama yöntemi şöyle tanımlanır olduğu jenerik sınıfı:

public class ExtendedLookupManagerViewModel<VMod, Mod> : LookupManagerViewModel 
where VMod : ExtendedLookupViewModel 
where Mod : ExtendedLookupModelBase 

ve böyle bir örneğini oluşturmak istiyorum: property

_medProd = new ExtendedLookupManagerViewModel<MedicinalProductViewModel, MedicinalProduct>(string property); 

sıralamak üzerine bir özelliktir. İdeal olarak bu tip güvenli olmalı, ancak bir dize yeterli olacaktır.

Herkes beni doğru yönde yönlendirmeye yardım edebilir mi lütfen?

+3

ne olacağını soruyorsunuz, yayınladığınız kodun ilk satırı, gereksinimlerinizin açıklamasından istediklerinizi yapıyor, ancak kurucunuzun görüştüğünüzden bahsettiğiniz şeyle ilgisi yok. Çok kafam karıştı. Sıralamaya çalıştığınız koleksiyonunuz nedir? –

+0

Tam olarak haklısınız, ilk satır çalışıyor, ancak yalnızca generic kullanarak değil, ExtendedLookupManagerViewModel türetilmiş belirli bir tür kullanırsam. BrandName, MedicinalProductViewModel'de bir özelliktir, ancak başka türde kullanırsam başka bir özelliği kullanabilmem gerekir. Tahmin ettiğim soru, x.BrandName yerine geçirilmiş bir parametreyi nasıl kullanabileceğim.Umarım bunu biraz daha netleştirir? – pilsdumps

cevap

2

Yapıcı öğenizin sıralama yöntemi için eşle eşleşmesini sağlayın ve Sırala() çağrıldığında koleksiyonda kullanmak için paramları önbelleğe alın. Yani "string özelliği" değil, daha ziyade sig, sıralama yöntemi için ne olursa olsun.

geçirilen parametre daha sonra belirli tip ve eleman yönlendiren olabilecek bir fonk olurdu örnekleme ben lambdas ve jenerik ile oldukça iyiyim, ama ben çözemiyorum

_medProd = new ExtendedLookupManagerViewModel<MedicinalProductViewModel, MedicinalProduct>(x => x.BrandName, ListSortDirection.Ascending); 
+0

Teşekkürler millet, sorun çözüldü ve arka görüşte bir muppet. Basit ExtendedLookupManagerViewModel kurucuları içindedir SortBy Func eklenmiş ve yukarıda Jimmy tarafından açıklanan denir. Şimdi sıralamak için çağrı _lookuplistViewModel.Sort (_sortby, ListSortDirection.Ascending); Tekrar teşekkürler. – pilsdumps

1

Peki, Sıralama yönteminiz yalnızca TKey içinde geneldir - T nereden geliyor? Func<VMod, TKey> veya Func<Mod, TKey> olması gerektiğinden şüpheleniyorum, ancak gösterdiğiniz şeyden emin değilim.

BrandName - MedicinalProductViewModel veya MedicinalProduct ürününün özellikleri nelerdir? o MedicinalProduct varsayarak, sizin yöntem olarak ilan edilmelidir: Ben işe yarayacak ... şüpheli Bu noktada

public void Sort<TKey>(Func<Mod, TKey> keySelector, ListSortDirection direction) 

+0

T, SortableObservableCollection türüdür (genel sınıf SortableObservableCollection : ObservableCollection ). BrandName, VMod'in bir model modelleme modelidir (Model). Sorun, BrandName özel bir tür (yani. MedicinalProductViewModel) bir özelliktir, bu nedenle sıralama yöntemini çalıştırmak için bu nesne türünü kullanmak zorundayım. ExtendedLookupViewModel türetilmiş herhangi bir tür kullanmak ve BrandName yerine sıralamak için özellik belirtmek istiyorum ama geçirilen parametre ile x.BrandName değiştirmeyi bilmiyorum. – pilsdumps

+0

@pilsdumps: Ama 'SortableObservableCollection ' üzerinde Sıralama'yı çağırmıyorsunuz, buna "ExtendedLookupManagerViewModel " ile diyorsunuz. Önerdiğim değişikliği denediniz mi? (Muhtemelen yerine Mod' 'arasında' VMod' kullanarak?) –

2

Bir dize mülkiyet argüman kabul ziyade bir Func<T, IComparable> nerede edilmemelidir T, sıralama yapmaya çalıştığınız şeye bağlı olarak muhtemelen VMod veya Mod'dur.

+0

Tamam, ben kabul ediyorum ama ben o geçerdi nasıl emin değilim. Ben TKey böylece, üzerinde sıralamak için T tuşuna (mülkiyet) olduğunu düşünüyorum Bunu yapmak için nasıl giderim? _medProd = yeni ExtendedLookupManagerViewModel (Func pilsdumps

İlgili konular