2010-03-29 3 views
5

람다 식에 대한 지식이 약간 불안정하며 람다 식 (일명 LINQ)을 사용하는 코드를 작성할 수 있지만 직접 작성하려고합니다. 메서드는 람다 식 유형의 몇 가지 인수를 사용합니다.메서드로 람다 식을 처리하는 방법 - C# .NET 3.5

배경 : 글자 그대로 다른 객체 유형의 TreeItem 유형의 객체에 대한 Tree Collection을 반환하는 메소드를 작성하려고합니다. 나는 지금까지 다음과 같습니다 단지를 통해 호출 할 수 있습니다

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

이 ... ...

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

내가 문자열 값으로 표현식을 대체 할 수있는, 그리고 것은 반사를 사용하지만, 난 이것을 강력하게 입력하고 싶을 때 이것을 피하려고합니다.

이유는 내가 트리 구조로 모두 수십 가지가 있고 수십 가지의 변환 방법을 쓰고 싶지 않지만 반면 TreeItem 형식의 목록을 받아들이는 컨트롤이 있다는 것입니다. 각 유형 (DRY 원칙을 고수하려고 함).

나는 올바른 방향으로 가고 있습니까? 아마도 이것을하는 더 좋은 방법이 있을까요?

답변

7

"람다 식"과 같은 유형이 없습니다. 람다 식은 호환되는 대리자 형식 또는 expression tree으로 변환 할 수 있습니다.

기존 메소드 서명은 표현 트리를 사용합니다.하지만 실제로 필요한 것은 분명하지 않습니다. (몇 가지 매개 변수 이름 변경) 위임 양식을 시도해보십시오

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 

이 그럼 당신은 같은 것을 할 수 있습니다

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

화려한 있다고! 내가 한 것만 큼 고마워. 식은 다음과 같이 대리자로 변환 될 수 있습니다. Func > childFunc = childProperty.Compile(); 하지만 당신이 말했듯이, Func 델리게이트 타입 대신 건배를 전달할 필요는 없습니다! –

관련 문제