2017-02-03 5 views
3

마스터 정렬 열이 어떤 열인지에 따라 테이블의 보고서 데이터를 계단식으로 정렬 할 수있는 프레임 워크를 만들었습니다. 필드의 속성이 값 유형일 때 중요한 하나의 경우를 제외하고는 대부분 작동합니다. 나는 다음과 같은 오류 메시지가 나타납니다ValueType을 사용한 동적 표현 생성 문제

System.ArgumentException 형식 '선택 System.Int32'의 발현은 반환 형식을 사용할 수 없습니다 '으로 System.Object'

나는 이것이 내가 필요 의미 알고 상자에 ValueType의 값을 입력해야하지만이 특정 상황에서 어떻게해야하는지 완전히 확신 할 수는 없습니다. 일부 연구마다 this SO answer 나는 어떤 식 으로든 Expression.Convert을 사용해야한다고 생각합니다.

아래 코드는 표현식을 생성하는 코드입니다. 제네릭 형식 매개 변수 T는 데이터의 "행"유형입니다. GetFullSortOrder()은 단순히 정렬 될 T 유형의 열 (특성)의 이름을 나타내는 문자열 배열을 반환합니다. T에서 선택된 속성이 치형의 경우 Expression.Lambda<Func<T, object>>() 처리시

public IEnumerable<Expression<Func<T, object>>> GetExpressions<T>(string sortedColumn) where T : IReportRecord 
    { 
     var columns = GetFullSortOrder(sortedColumn) 
     var typeParameter = Expression.Parameter(typeof(T)); 
     foreach (var c in columns) 
     { 
      var propParameter = Expression.Property(typeParameter, c); 
      yield return Expression.Lambda<Func<T, object>>(propParameter, typeParameter); 
     } 
    } 

예외가 발생된다. 런타임까지 유형을 알 수 없을 때 속성 상자에 필요한 값이나 올바른 값을 반환하는 데 필요한 것은 무엇입니까?

답변

3

당신은 그것을했다 - 당신이 Expression.Convert을 사용하고 typeof(object)을 통과해야합니다. C# 컴파일러의 기능을 시뮬레이션하려면 값 유형에만 사용해야합니다.

Expression result = propParameter; 
if (typeof(T).IsValueType) 
    result = Expression.Convert(result, typeof(object)); 
yield return Expression.Lambda<Func<T, object>>(result, typeParameter); 
1

당신은 객체 유형에 재산 Expression을 변환 할 수 있습니다

var propParameterObj = Expression.Convert(propParameter, typeof(object)); 
+0

그런 다음 'Expression.Lambda <>()'호출에서 사용하십시오. – JNYRanger

+0

@JNYRanger 예, 모든 매개 변수에 대해 수행 할 것입니다.하지만 ref 유형에 대한 변환이 필요하지 않습니다. –

+0

예 참조 유형에는 필수 항목이 아니지만 나중에 모든 유형에 대해 작업 할 때 최적화 할 것입니다. – JNYRanger