2017-04-04 2 views
2

DynamicObject에서 파생 된 클래스가 있습니다. BindingList ApplyCoreSort에 TypeDescriptor로 전달 된대로 속성을 사용하여 정렬하고 싶습니다. 저는 여기와 다른 사이트에서 여러 가지 예제를 시도했지만 많은 사람들이 C#에 있으며 VB로 잘 번역되지 않습니다. 나는 좋은 단순하게이 MSDN blog에서 방법을 찾았지만, VB로 변환 할 때 실패 : 원래의 코드가 동적 유형에 의존하기 때문에 동적 객체에서 동적 표현식을 사용하여 VB Linq 정렬

Private Shared Function Sort(source As IEnumerable, [property] As String) As DynamicEntity() 
    Dim binder__1 = RuntimeBinder.Binder.GetMember(CSharpBinderFlags.None, [property], GetType(Example3), New CSharpArgumentInfo() {CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, Nothing)}) 
    Dim param = Expression.Parameter(GetType(DynamicEntity), "o") 
    Dim getter = Expression.Dynamic(binder__1, GetType(Object), param) 
    Dim lambda = Expression.Lambda(Of Func(Of DynamicEntity, Object))(getter, param).Compile() 
    Return source.Cast(Of DynamicEntity)().OrderBy(lambda).ToArray() 
End Function 

은 주로 VB에서 개체 유형을 대체 할 수있는 :

Func(Of DynamicEntity, Object) 

VS

Func<DynamicObject, dynamic> 

는 C# 당량 이하이다

불행히도 컴파일러가 IEnumerable 형식이 OrderBy 또는 OrderByDescending을 지원하지 않는다고 불평하므로 불행히도이를 C#으로 다시 변환하여 다른 DLL에 넣는 것은 작동하지 않습니다.

누구나 VB에서이 작업을 수행하거나 실제로 작동하는 대체 예제를 제안 할 수있는 방법을 제안 할 수 있습니까? 객체가 아닌 문자열이 반환되기 때문에 동적 표현식 컴파일러가 런타임에 표현식을 컴파일하는 것을 거부하므로 객체를 동적으로 변경하면 작동하지 않습니다.

몇 가지 예제를 확인했는데 동적 객체를 정렬 할 때 제대로 작동하지 않는 것으로 보이며 대다수는 VS 2010 VB에서 .NET Framework 4로 컴파일되지 않습니다. VB에서 작동하도록 정렬 함수 위의 감사 할 것입니다.

답변

0

일반 표현 트리를 사용하여 linq의 OrderBy를 호출 할 수 있습니다 (답변 here처럼)?

내가 (아니지만 확장으로) 편의를 위해 여기에 그 해답의 VB 버전을 포함 시켰습니다

:

Public Shared Function Sort(Of T)(source As IQueryable(Of T), propertyName As String, sortOrder As ListSortDirection) As IQueryable(Of T) 
    Dim type = GetType(T) 
    Dim propertyInfo As PropertyInfo = type.GetProperty(propertyName) 
    Dim parameterExpression As ParameterExpression = Expression.Parameter(type, "p") 
    Dim propertyAccess As MemberExpression = Expression.MakeMemberAccess(parameterExpression, propertyInfo) 
    Dim sortExpression As LambdaExpression = Expression.Lambda(propertyAccess, parameterExpression) 
    Dim sortMethod = If(sortOrder = ListSortDirection.Ascending, "OrderBy", "OrderByDescending") 
    Dim resultExpression = Expression.[Call](
         GetType(Queryable), 
         sortMethod, 
         New Type() {type, propertyInfo.PropertyType}, 
         source.Expression, 
         Expression.Quote(sortExpression) 
        ) 
    Return source.Provider.CreateQuery(Of T)(resultExpression) 
End Function