2017-03-22 3 views
0

동적 속성 이름을 사용하는 linq 쿼리를 작성하려고합니다. 그래서 예를 들어 속성 ​​이름은 '시험'인 경우, 간단한 쿼리는 다음과 같습니다동적 속성 이름

var test = testList.Select(x => x.test).Distinct().ToList(); 

하지만 예를 들어, 동적 속성 이름을 생성 할 :

var propertyName = "test"; 

var test = testList.Select(x => x.propertyName).Distinct().ToList(); 

내가 얻을 'propertyName'이 실제 속성이 아니기 때문에 오류가 발생했습니다.

이것을 달성하는 가장 좋은 방법은 무엇입니까?

+3

. 'testList'가'ExpandoObjects' (권장되지 않음)로 가득 차 있다면, 그것들을'IDictionary '로 캐스팅하고 문자열로 색인 할 수 있습니다. 리플렉션을 사용할 수도 있습니다 (모두 권장하지는 않습니다). 그러나 실제로이 작업을 수행 할 필요는 거의 없습니다. 해결 방법이 LINQ 쿼리를 사용하여 어떤 문제가 있습니까? –

+0

... 오, 당신은'Expression '또는 무엇이든으로 속성 선택자 람다를 만들 수 있습니다. 나는 그것이 어쩌면 다른 사람들보다 더 권장되는 방법을 알지 못한다. –

+0

답장을 보내 주셔서 감사합니다. 저는 아마도이 잘못된 방향으로 가고 있습니다. 난 그냥 이것과 비슷한 속성의 고유 값 목록을 추출하려고 해요 - http://stackoverflow.com/questions/10255121/get-a-list-of-distinct-values-in-list 하지만 이 작업을 수행하는 데 필요한 몇 가지 속성 및 클래스. 나는 코드를 복제 할 필요가 없도록 속성 이름을 동적으로 생성하려고했습니다. – richard

답변

4

당신은 당신이하려고하는 일을 할 리플렉션을 사용해야 할 것 : 당신은 할 수 없습니다

var test = testList 
       .Select(x => x.GetType().GetProperty(propertyName).GetValue(x)) 
       .Distinct() 
       .ToList(); 
+3

물론 모든 타입 검사를 잃어 버리므로 더러운 오류가 발생하기 쉽습니다. – DavidG

+0

또한, 이것은 같은 것이 아니라,'object'의 열거 형을 반환하는 반면 원래 코드는 유형 특정 적입니다. – DavidG

+0

@DavidG 좋은 지적입니다. 당신이이 표현식을 사용하는 모든 속성의 반환 유형을 알고 있다면'.Distinct()'앞에'.Cast ()'을 추가하거나 GetValue() 객체를 캐스팅 할 수 있습니다. '반환합니다. 제안 된 @EdPlunkett와 같은 표현식을 구축하는 것이 더 안전 할 것입니다. – itsme86