2011-10-30 4 views
1

동적으로 "GPARank"와 같은 문자열 속성을 가져 와서 그 값을 변경하고 싶습니다.동적 링크, 목록의 모든 항목에 대한 속성 변경

일반적으로, 나는

var rank = gpa.ForEach(x => x.GPARank = i); 

있을 것입니다하지만이 경우에는, 나는 컴파일 시간에 변화하고있는 부동산 모른다. 내 용도로 Marc Gravell의 코드를 Dynamic LINQ OrderBy on IEnumerable<T>에서 수정하려고 시도했지만 뇌가 폭발했습니다.

감사합니다. 반사를 사용하여 알아 낸

은 아직도 내가이 사용하는 반사를 수행하는 방법을 알아낼 수 있었다 동적 LINQ 식 솔루션을

gpa.ForEach(x => x.GetType().GetProperty(_ColumnRank).SetValue(x, i += 1 , null)); 

를 원한다. 그러나 누군가가 런타임 표현식을 사용하여 동적 linq를 사용하여이 작업을 수행하는 방법을 보여줄 시간이 있거나 원하는 경우이 작업을 수행하는 방법을 알고 싶습니다. 검증되지 않은

+0

컴파일 타임에 어떤 속성을 변경하는지 알 수없는 이유는 무엇입니까? – GianT971

+0

나는 20+ 순위가있는 클래스를 가지고 있는데, 사용자가 필터링하고 다시 주문하면 linq을 사용하여 데이터베이스에 접근하지 않고 싶습니다. – bladefist

+0

키보드의 두뇌 튀김에 대한 책임을지지 않습니다. 다음으로 LINQ는 주로 쿼리가 아니라 돌연변이입니다. 4.0에서는 Expression이 할당을 허용하지만 단순한 위임이 훨씬 쉽습니다. 나는 지금 PC에 없지만, 원한다면 내일 대표단 버전을 추가 할 수 있습니다. AFAIK 공급자가 사용하지 않으므로 Expression 버전이 가치가 있는지 확신 할 수 없으므로 궁극적으로 대리자를 만드는 것은 까다로운 방법입니다. –

답변

1

의사 코드 :

string propName = "GPARank"; 
PropertyInfo prop = typeof(Item).GetProperty(propName); 
Action<Item,string> setter = (Action<Item,string>)Delegate.CreateDelegate(
    typeof(Action<Item,string>), prop.GetSetMethod()); 
foreach(Item obj in list) setter(obj,newValue); 

그냥 작동합니다 (SetValue를 통해) 직접 PropertyInfo를 사용하여 대부분의 경우에, 그러나 정직하게; 이 경우 원래 코드에 적용 할 수있는 유일한 변경 사항은 항목 당이 아닌 외부의 PropertyInfo 을 이동하는 것입니다.

+0

답변 해 주셔서 감사합니다. 이 물건은 매우 흥미 롭습니다. – bladefist

관련 문제