2010-03-29 22 views
5

Kiến thức của tôi về các biểu thức Lambda hơi run rẩy, trong khi tôi có thể viết mã sử dụng các biểu thức Lambda (hay còn gọi là LINQ). phương thức nhận một vài đối số có kiểu Lambda Expression.Làm thế nào để xử lý các biểu thức Lambda được truyền vào trong phương thức - C# .NET 3.5

Thông tin cơ bản: Tôi đang cố gắng viết phương thức trả về Bộ sưu tập cây của các đối tượng thuộc loại TreeItem từ nghĩa đen BẤT CỨ loại đối tượng khác. Tôi đã sau cho đến nay:

public class TreeItem 
{ 
    public string Id { get; set; } 
    public string Text { get; set; } 

    public TreeItem Parent { get; protected set; } 

    public IList<TreeItem> Children 
    { 
     get 
     { 
      // Implementation that returns custom TreeItemCollection type 
     } 
    } 

    public static IList<TreeItem> GetTreeFromObject<T>(IList<T> items, 
     Expression<Func<T, string>> id, 
     Expression<Func<T, string>> text, 
     Expression<Func<T, IList<T>>> childProperty) where T : class 
    { 
     foreach (T item in items) 
     { 
      // Errrm!?? What do I do now? 
     } 

     return null; 
    } 
} 

... mà có thể được gọi thông qua ...

IList<TreeItem> treeItems = TreeItem.GetTreeFromObject<Category>(
    categories, c => c.Id, c => c.Name, c => c.ChildCategories); 

tôi có thể thay thế các biểu thức với các giá trị chuỗi, và chỉ sử dụng phản chiếu, nhưng tôi cố gắng tránh điều này vì tôi muốn đánh máy mạnh mẽ. Lý do của tôi để làm điều này là tôi có một điều khiển chấp nhận một List của TreeItem loại, trong khi tôi có hàng chục loại khác nhau được tất cả trong một cây như cấu trúc, và không muốn viết các phương pháp chuyển đổi riêng biệt cho mỗi loại (cố gắng tuân theo nguyên tắc DRY).

Tôi có thực hiện đúng cách này không? Có cách nào tốt hơn để làm điều này có lẽ?

Trả lời

7

Không có loại như "biểu thức lambda". Một biểu thức lambda có thể được chuyển đổi thành một loại đại biểu tương thích, hoặc một expression tree.

Chữ ký phương thức hiện có của bạn sử dụng cây biểu thức - nhưng không rõ ràng là nó thực sự cần. Hãy thử hình thức đại biểu (với một vài thay đổi tên tham số):

public static IList<TreeItem> GetTreeFromObject<T>(IList<T> items, 
    Func<T, string> idSelector, 
    Func<T, string> textSelector, 
    Func<T, IList<T>> childPropertySelector) where T : class 

Sau đó, bạn có thể làm một cái gì đó như thế này:

foreach (T item in items) 
{ 
    string id = idSelector(item); 
    string text = textSelector(item); 
    IList<T> children = childPropertySelector(item); 
    // Do whatever you need here 
} 
+0

Đó là tuyệt vời! Chỉ là những gì tôi đã sau, cảm ơn bạn rất nhiều! Lưu ý các biểu thức có thể được chuyển đổi thành các đại biểu như vậy: Func > childFunc = childProperty.Compile(); nhưng như bạn đã nói không cần phải, chỉ cần vượt qua loại Func ủy quyền, hãy cổ vũ! –

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