使用反射和表达式 lambda 动态排序日期时间



我构建了一个 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]'上。

我也尝试刻度,日期或年份,,值

刻度,获取值或默认.年.到字符串,但相同的错误

也许有更好的方法

感谢您的帮助

  1. .Contains("DateTime")将匹配Nullable<DateTime>DateTime类型,您看到的错误是因为您尝试调用obj.Value.ToString("yyyy MM dd") 您编写的内容不是可为空对象的 ToString 重载(它只是调用它包含的 ToString 方法),而是包含的 DateTime 对象的重载
  2. 反射对象上有一个布尔值,它会告诉您是查看实际类型还是通用对象(如 Nullable<>)
  3. 这也是找不到 Ticks 属性的原因,因为它只存在于子对象DateTime上。在普通代码中Nullable<>对象被隐式转换为其包含的类型(自动导航到 Value 对象)
  4. 查看 msdn,您将参数作为 C# 中的第 4 个参数传入,而不是在字符串中设置它们,VB 可能相同
  5. 我认为您可以通过调用"Value.Ticks"
  6. 来使用字符串参数导航到 Value 对象,因为首先"Ticks"不是一个方法,它是一个属性,其次 .Net 将无法将字符串转换为 methodInfo 对象从Nullable<T>类型 - 因为它不存在。

应导航到"Value"对象或强制转换为基础对象类型作为Expr表达式的一部分,方法是检测它是否是泛型Nullable<T>类型

最新更新