2010-07-27 41 views
7

Vì vậy, tôi là một chút ra khỏi vùng thoải mái của tôi khi giao dịch với Func <>, Generics và lambda biểu thức nhưng tôi nghĩ rằng tôi nhận được ý tưởng chung (loại) nhưng vẫn còn một chút nhầm lẫn.C# Func <> và generics

Tôi đã thực hiện lớp SortableObservableCollection (lấy từ trên mạng ở đâu đó - nhờ ai đó là tôi đã nhận nó từ!) Và nó được sử dụng như thế này:

_lookuplistViewModel.Sort(x => x.BrandName, ListSortDirection.Ascending); 

trong đó x là các loại đối tượng thực hiện bởi bộ sưu tập có thể sắp xếp. Trong trường hợp này, BrandName là thuộc tính của kiểu đối tượng được triển khai thực hiện, nhưng tôi muốn sử dụng mã ở trên trong một lớp chung và chuyển vào thuộc tính để sắp xếp. Sort phương pháp trông như thế này:

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

Lớp generic mà trên đó các Sắp xếp phương pháp được gọi là được định nghĩa như thế này:

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

và tôi muốn tạo một thể hiện của nó như thế này:

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

trong đó property là thuộc tính cần sắp xếp. Lý tưởng nhất này nên được loại an toàn, nhưng một chuỗi sẽ đủ.

Có ai có thể giúp hướng dẫn tôi đi đúng hướng không?

+3

tôi khá ổn với lambdas và Generics, nhưng tôi không thể tìm ra những gì bạn đang yêu cầu, dòng đầu tiên của mã bạn đăng tải là những gì bạn đang yêu cầu từ mô tả yêu cầu của bạn, nhưng sig constructor của bạn dường như không liên quan gì đến những gì bạn đang nói đến. Tôi rất bối rối. Bộ sưu tập của bạn mà bạn đang cố gắng sắp xếp là gì? –

+0

Bạn hoàn toàn đúng, dòng đầu tiên không hoạt động nhưng chỉ khi tôi sử dụng một loại cụ thể có nguồn gốc từ ExtendedLookupManagerViewModel thay vì sử dụng Generics. BrandName là một tài sản trên MedicinalProductViewModel, nhưng nếu tôi sử dụng một loại khác tôi cần để có thể sử dụng tài sản khác. Câu hỏi tôi đoán là làm thế nào tôi có thể sử dụng một tham số được thông qua thay vì x.BrandName.Hy vọng rằng làm cho nó một chút rõ ràng hơn? – pilsdumps

Trả lời

2

Chỉ cần làm cho sig của hàm tạo phù hợp với sig cho phương thức sắp xếp và lưu các tham số để sử dụng trong bộ sưu tập khi sắp xếp() được gọi. Vì vậy, không phải "chuỗi tài sản" nhưng thay vì bất cứ điều gì sig là cho phương pháp sắp xếp.

Các tham số thông qua sau đó sẽ là một func đó có thể là loại hình cụ thể và chỉ đạo bạn yếu tố, instantiation sẽ

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

Cảm ơn mọi người, vấn đề đã được giải quyết và trong tầm nhìn tôi là một con rối. Tôi đơn giản thêm Func sortby trong hàm tạo của ExtendedLookupManagerViewModel và gọi nó như mô tả của Jimmy ở trên. Cuộc gọi sắp xếp bây giờ là _lookuplistViewModel.Sort (_sortby, ListSortDirection.Ascending); Cảm ơn bạn lần nữa. – pilsdumps

1

Vâng, phương thức sắp xếp của bạn chỉ chung chung trong TKey - T đến từ đâu? Tôi nghi ngờ nó phải là Func<VMod, TKey> hoặc Func<Mod, TKey> nhưng tôi không chắc chắn từ những gì bạn đã hiển thị.

Điều gì sẽ BrandName là tài sản của - MedicinalProductViewModel hoặc MedicinalProduct? Giả sử đó là MedicinalProduct, phương pháp của bạn nên được khai báo là:

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

Vào thời điểm đó tôi nghi ngờ nó sẽ làm việc ...

+0

T là loại SortableObservableCollection (lớp công khai SortableObservableCollection : ObservableCollection ). BrandName là một tài sản của cả hai kể từ khi VMod là một Modem xem mô hình (mô hình). Vấn đề là BrandName là tài sản của một loại cụ thể (ví dụ: MedicinalProductViewModel) vì vậy tôi phải sử dụng loại đối tượng này để chạy phương thức sắp xếp. Tôi muốn có thể sử dụng bất kỳ loại nào có nguồn gốc từ ExtendedLookupViewModel và chỉ định thuộc tính để sắp xếp thay vì BrandName nhưng tôi không biết cách thay thế x.BrandName bằng tham số được truyền của tôi. – pilsdumps

+0

@pilsdumps: Nhưng bạn không gọi sắp xếp trên 'SortableObservableCollection ' - bạn đang gọi nó trên 'ExtendedLookupManagerViewModel '. Bạn đã thử thay đổi tôi đã đề xuất chưa? (Có thể sử dụng 'VMod' thay vì' Mod'?) –

2

Bạn không nên chấp nhận một đối số tài sản chuỗi, mà là một nơi Func<T, IComparable> T có lẽ là VMod hoặc Mod, tùy thuộc vào những gì bạn đang cố sắp xếp.

+0

Ok, tôi đã xem xét điều đó nhưng tôi không chắc chắn làm thế nào tôi vượt qua được. Tôi nghĩ TKey là chìa khóa (tài sản) trên T để sắp xếp, vì vậy Tôi sẽ làm thế nào? Mọi thứ như _medProd = new ExtendedLookupManagerViewModel (Func pilsdumps

Các vấn đề liên quan