2012-02-17 6 views
9

나는 나중에 평가할 람다 식 형태로 몇 가지 속성을 전달하고자하는 클래스 MyDummyClass을 가지고 있습니다. 그래서 나는람다 식으로 속성 이름 목록을 전달하는 가장 좋은 방법

public class MyDummyClass<T> 
{ 
    public MyDummyClass(Expression<Func<T, object>> property) 
    { 
     ... 
    } 
    ... 
} 

처럼 뭔가를 할 수 있습니다 .. 그리고 마우스 오른쪽, new MyDummyClass<Person>(x=>x.Name) 같은 클래스를 사용할 수 있습니까?

그러나 그렇다면 하나의 속성뿐만 아니라 속성 목록도 전달하고 싶습니다. 그래서

public class MyDummyClass<T> 
{ 
    public MyDummyClass(IEnumerable<Expression<Func<T, object>>> properties) 
    { 
     ... 
    } 
    ... 
} 

처럼 내 클래스를 써서 내가 같은 new MyDummyClass<Person>(new[] { x=>x.Name, x=>x.Surname })처럼 사용하지만 불행히도 그 작동하지 않는 거라고! 대신 작성해야합니다

new MyDummyClass<Person> 
    (new Expression<Func<Person, object>>[] { x=>x.Name, x=>x.Surname}); 

하지만이 글은 약간 어색하지 않습니까? 물론 매개 변수을 사용하면이 코드는이 아닌 매개 변수를 사용하는보다 복잡한 코드 조각의 샘플 일뿐입니다. 누구나 이보다 더 좋은 옵션이 있습니까 ??

+3

왜 'params'를 사용하지 않으시겠습니까? 가장 간단한 접근 방식이며 대리자 유형을 지정하지 않아도 작동합니다. –

+0

나는 params에도 투표합니다. 그것은 문법을 매우 깔끔하게 유지할 것이고, 처음부터 당신이 원했던 배열을 사용합니다. – Umair

+0

물론,이 간단한 예제에서 보면, 매개 변수를 사용할 수없는 좀 더 복잡한 곳에서 추출한 것입니다. 그 사이에 다른 선택적 매개 변수가 있으므로 작동하지 않습니다 ... 슬프게도 – Juri

답변

3

당신은 시도 할 수 :

public MyDummyClass(params Expression<Func<T, object>>[] properties) 

이 그럼 당신은 할 수 있어야

public class MyDummyClass<T> 
{ 
    public MyDummyClass(Expression<Func<T, object>> expression) 
    { 
     NewArrayExpression array = expression.Body as NewArrayExpression; 
     foreach(object obj in (IEnumerable<object>)(array.Expressions)) 
     { 
      Debug.Write(obj.ToString()); 
     } 
    } 
} 

을 그리고 당신이 그것을 부를 것이다 이렇게 :

MyDummyClass<Person> cls = new MyDummyClass<Person>(item => new[] { item.Name, item.Surname }); 

"obj"에서 ToString을 수행하면 지정된 실제 인스턴스가 없으므로이 값은 속성의 값을 제공하지 않습니다. 이것이 네가 무엇인지 알 수는 없지만 출발점 일 수있다.

+0

나중에 속성 경로를 추출하는 것은 문제가되지 않습니다. 이미 알고 있지만 ... thx, 접근 방식이 가능할 수 있습니다. – Juri

+0

이 접근법의 주요 이점은 생성자 (두 번째 스 니펫)에 속성을 전달하는 것이 간단하고 어색한 구문을 갖고 있으며 원래 게시물에서 언급 한 내용과 비슷하다는 것입니다. – MotoSV

+0

Person 클래스에 다른 유형의 속성이있는 경우 문제가 있습니다. 예를 들어, Age (int) 속성을 포함합니다. 도움?새 객체 []를 사용하는 [Update]가 올바름 – fravelgue

6

에 한번 사용 PARAMS 대신 :

var dummy = new DummyClass<Person>(x => x.Name, x => x.Surname); 
+0

편집자 주셔서 감사합니다. 그건 내 아이폰의 기차에서 ... –

+0

물론, 나는 그것이 매개 변수와 함께 작동한다는 것을 알고, 나는 내 구체적인 상황에서 그것을 사용할 수 없습니다. 왜냐하면 그 사이에는 선택적 매개 변수가 있기 때문에 작동하지 않습니다 ... – Juri

+0

매우 달콤한 .. 그냥 닥터. 주문했다 !! – gcoleman0828

관련 문제