我构建了一个VB.NET代码来排序几个类型的字符串,数字......现在我尝试过日期。
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 Typ = pinfo.PropertyType.Name
Dim toStr As Expression
Dim Expr As Expression = Expression.Property(paramExpr, pinfo)
toStr = Expression.Call(If(pinfo.PropertyType.IsValueType, Expr, Expression.Coalesce(Expr, Expression.Constant(String.Empty))), "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
问题是当我排序它不是排序日期而是像
这样的字符串31/12/2005; 31/11/2011; 31/10/2007 ......
当我排序时,最好找到
31/11/2011; 31/10/2007; 31/12/2005
然后我尝试修改
If Typ.Contains("DateTime") Then 'Add For DateTime here
toStr = Expression.Call(If(pinfo.PropertyType.IsValueType, Expr, Expression.Coalesce(Expr, Expression.Constant(Date.MinValue))), "ToString", Nothing)
Else
toStr = Expression.Call(If(pinfo.PropertyType.IsValueType, Expr, Expression.Coalesce(Expr, Expression.Constant(String.Empty))), "ToString", Nothing)
End If
但我不知道如何替换'ToString'
我试试
toStr = Expression.Call(If(pinfo.PropertyType.IsValueType, Expr, Expression.Coalesce(Expr, Expression.Constant(Date.MinValue))), "ToString(""yyyy MM dd"")", Nothing)
但我正在追踪错误
ex = {“Aucuneméthode'ToString(”yyyy MM dd“)'n'existe sur le type'System.Nullable`1 [System.DateTime]'。”}
Google翻译
“没有方法”ToString(“yyyy dd MM”)'存在于'System.Nullable`1 [System.DateTime]'类型上。
我尝试过Ticks,Date或Year ,, Value.Ticks,GetValueOrDefault.Year.ToString但同样的错误
也许有更好的方式
向你求助
答案 0 :(得分:1)
.Contains("DateTime")
会匹配Nullable<DateTime>
和DateTime
类型,您看到的错误是因为您尝试拨打obj.Value.ToString("yyyy MM dd")
您所写的内容对于可以为空的对象(只是调用它包含ToString方法)的ToString重载,它是包含DateTime
对象的重载Ticks
属性的原因,因为它只存在于子DateTime
对象上。在您的普通代码Nullable<>
中,对象被隐式转换为其包含的类型(自动导航到Value对象)Nullable<T>
类型的methodInfo对象 - 因为它不存在。< / LI>
醇>
你应该导航到&#34;价值&#34;通过检测它是否为通用Expr
类型
Nullable<T>
表达式的一部分