我使用动态方法来订购对象列表。
For Each Sort In MesDonnees.MesOptions
If Sort.Sens < 2 Then
Dim sortPropertyName As String = Sort.ColName
If (TypeClass.GetProperties().Any(Function(prop) prop.Name = sortPropertyName AndAlso prop.CanRead)) Then
'Information sur la propriété recherchée
Dim pinfo As PropertyInfo = TypeClass.GetProperty(sortPropertyName)
Dim Expr As Expression = Expression.Property(paramExpr, pinfo)
Dim Tostr As Expression = Expression.Call(Expr, "ToString", Nothing)
Dim orderByFunc As Func(Of MaClass, Object) = Expression.Lambda(Of Func(Of MaClass, Object))(Tostr, paramExpr).Compile()
Dim sortFunc As Func(Of IEnumerable(Of MaClass), IOrderedEnumerable(Of MaClass)) = Nothing
If (Not CBool(Sort.Sens)) Then
sortFunc = (Function(source) source.OrderBy(orderByFunc))
Else
sortFunc = (Function(source) source.OrderByDescending(orderByFunc))
End If
query = sortFunc(query).ToList()
End If
End If
Next
Sort.ColName
是我想要过滤的字段的名称。
当我没有空值时,它是完美的但是当我有一个空值时,我在行query = sortFunc(query).ToList()
中得到一个例外:
对象引用未设置为对象的实例
我看到了Expression.Call
和ISNullOrEmpty
的不同代码,但我不知道在我的情况下如何正确使用它。我希望null或Empty首先像“”。
感谢您的帮助和解释
答案 0 :(得分:2)
您可以更改toStr
表达式以包含Coalesce操作,其中右表达式是常量。请注意,左表达式需要是引用类型(或可空值类型),因此您还需要确保属性类型不是值类型。
这是一个应该有效的例子:
Dim toStr As Expression = Expression.Call(
If(pinfo.PropertyType.IsValueType, expr, Expression.Coalesce(expr, Expression.Constant(String.Empty))),
"ToString",
Nothing
)