我构建了一个 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
问题是当我排序时,它不是排序日期,而是像这样的字符串
2005/12/31; 2011/11/31; 2007/10/31 ...
当我排序时,最好找到
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 = {"Aucune méthode 'ToString("yyyy MM dd")' n'existe sur le type 'System.Nullable'1[System.DateTime]'."}
谷歌翻译
我也尝试刻度,日期或年份,,值"没有方法'ToString (" yyyy dd MM")'存在于类型'System.Nullable'1 [System.DateTime]'上。
刻度,获取值或默认.年.到字符串,但相同的错误
也许有更好的方法
感谢您的帮助
-
.Contains("DateTime")
将匹配Nullable<DateTime>
和DateTime
类型,您看到的错误是因为您尝试调用obj.Value.ToString("yyyy MM dd")
您编写的内容不是可为空对象的 ToString 重载(它只是调用它包含的 ToString 方法),而是包含的DateTime
对象的重载 - 反射对象上有一个布尔值,它会告诉您是查看实际类型还是通用对象(如 Nullable<>)
- 这也是找不到
Ticks
属性的原因,因为它只存在于子对象DateTime
上。在普通代码中Nullable<>
对象被隐式转换为其包含的类型(自动导航到 Value 对象) - 查看 msdn,您将参数作为 C# 中的第 4 个参数传入,而不是在字符串中设置它们,VB 可能相同 我认为您可以通过调用"Value.Ticks"
- 来使用字符串参数导航到 Value 对象,因为首先"Ticks"不是一个方法,它是一个属性,其次 .Net 将无法将字符串转换为 methodInfo 对象从
Nullable<T>
类型 - 因为它不存在。
应导航到"Value"对象或强制转换为基础对象类型作为Expr
表达式的一部分,方法是检测它是否是泛型Nullable<T>
类型