| 网站首页 | VB.Net实例分析 | .Net技术文摘 | 下载中心 | VB.Net书籍笔记 | .Net源码 | VBS脚本与组件调用 | Windows2008技术文摘 | 给我们留言 | 
最新公告:

  没有公告

您现在的位置: 乐博网 >> VB.Net实例分析 >> 其他 >> 实例分析正文
最新推荐 更多内容
LINQ查看表达式树的方法(VB2010实例)
LINQ查看表达式树的方法(VB2010实例)
作者:Akyao    来源:乐博网整理     更新时间:2011-6-20

本文演示如何LINQ查看表达式树的方法,来自乐博网lob.cn。

如果你想下载本文的源代码RAR压缩集合包  请访问
VB2010源代码集合包(芋头糕)    http://www.lob.cn/code/utility/2795.shtml
特别感谢网友 芋头糕 将此资源提供乐博网分享,欢迎加入 40797788 的.Net超级qq群交流。

LINQ查看表达式树的方法的代码 如下:

Imports System.Collections.ObjectModel
Imports System.Linq.Expressions
Imports System.Reflection
Imports System.Runtime.CompilerServices
Imports System.Runtime.Serialization
Imports System.Text
Imports System.Windows.Forms

<Extension()> _
Module ExpressionTreeExtension

    <Extension()> _
    Function ExtractName(ByVal name As String) As String
        Dim i = name.LastIndexOf("`")
        If i > 0 Then name = name.Substring(0, i)
        Return name
    End Function

    <Extension()> _
    Function ExtractGenericArguments(ByVal names() As Type) As String
        Dim builder = New StringBuilder("<")
        For Each genericArgument In names
            If builder.Length <> 1 Then builder.Append(", ")
            builder.Append(ObtainOriginalName(genericArgument))
        Next
        builder.Append(">")
        Return builder.ToString()
    End Function

    <Extension()> _
    Function ObtainOriginalName(ByVal type As Type) As String
        If Not type.IsGenericType Then
            Return type.Name
        Else
            Return ExtractName(type.Name) & ExtractGenericArguments(type.GetGenericArguments())
        End If
    End Function

    <Extension()> _
    Function ObtainOriginalMethodName(ByVal method As MethodInfo) As String
        If Not method.IsGenericMethod Then
            Return method.Name
        Else
            Return ExtractName(method.Name) & ExtractGenericArguments(method.GetGenericArguments())
        End If
    End Function

End Module

<Serializable()> _
Public Class ExpressionTreeNode
    Inherits TreeNode

    Public Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
        MyBase.New(info, context)
    End Sub

    Public Sub New(ByVal value As Object)
        Dim type = value.GetType()
        Text = type.ObtainOriginalName()

        If TypeOf value Is Expression Then
            ImageIndex = 2
            SelectedImageIndex = 2

            Dim propertyInfos() As PropertyInfo = Nothing
            If type.IsGenericType AndAlso type.GetGenericTypeDefinition() Is GetType(Expression(Of )) Then
                propertyInfos = type.BaseType.GetProperties(BindingFlags.Public Or BindingFlags.Instance)
            Else
                propertyInfos = type.GetProperties(BindingFlags.Public Or BindingFlags.Instance)
            End If

            For Each propertyInfo In propertyInfos
                If propertyInfo.Name <> "nodeType" Then
                    Nodes.Add(New AttributeNode(value, propertyInfo))
                End If
            Next
        Else
            ImageIndex = 4
            SelectedImageIndex = 4
            Text = """" & value.ToString() & """"
        End If
    End Sub

    Protected Overrides Sub Serialize(ByVal si As SerializationInfo, ByVal context As StreamingContext)
        MyBase.Serialize(si, context)
    End Sub

End Class

<Serializable()> _
Public Class AttributeNode
    Inherits TreeNode

    Public Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
        MyBase.new(info, context)
    End Sub

    Public Sub New(ByVal attribute As Object, ByVal propertyInfo As PropertyInfo)
        Text = propertyInfo.Name & " : " & propertyInfo.PropertyType.ObtainOriginalName()
        ImageIndex = 3
        SelectedImageIndex = 3

        Dim value = propertyInfo.GetValue(attribute, Nothing)
        If value IsNot Nothing Then
            If value.GetType().IsGenericType AndAlso value.GetType().GetGenericTypeDefinition() Is GetType(ReadOnlyCollection(Of )) Then
                If value.GetType().InvokeMember("get_Count", BindingFlags.InvokeMethod, Nothing, value, Nothing) = 0 Then
                    Text &= " : Empty"
                Else
                    For Each tree In value
                        If TypeOf tree Is Expression Then
                            Nodes.Add(New ExpressionTreeNode(tree))
                        ElseIf TypeOf tree Is MemberAssignment Then
                            Nodes.Add(New ExpressionTreeNode(CType(tree, MemberAssignment).Expression))
                        End If
                    Next
                End If
            ElseIf TypeOf value Is Expression Then
                Text &= CType(value, Expression).NodeType
                Nodes.Add(New ExpressionTreeNode(value))
            ElseIf TypeOf value Is MethodInfo Then
                Text &= " : """ & CType(value, MethodInfo).ObtainOriginalMethodName() & """"
            ElseIf TypeOf value Is Type Then
                Text &= " : """ & CType(value, Type).ObtainOriginalName() & """"
            Else
                Text &= " : """ & value.ToString() & """"
            End If
        Else
            Text &= " : Nothing"
        End If
    End Sub

    Protected Overrides Sub Serialize(ByVal si As SerializationInfo, ByVal context As StreamingContext)
        MyBase.Serialize(si, context)
    End Sub

End Class

  • 上一篇:

  • 下一篇: 没有了
  • 【字体: 】【打印此文】【关闭窗口
      相关文章:(只显示最新16条)
    在运行时创建LINQ查询的代码(VB2010实例)
    VB.Net使用LINQ获取单个进程使用的最大物理内存量
    VB.Net在LINQ中使用正则表达式设置查询条件
    VB.Net在LINQ to XML中通过内存将属性转换为元素
    VB.Net在LINQ to XML中使用XPath查询指定元素值
    VB.Net股票行情在LINQ to XML中执行文本到XML的流式转…
    VB.Net在LINQ to XML中将CSV文件转换为XML文件
    VB.Net在LINQ to XML中将XML文件转换为CSV文件
    VB.Net根据LINQ to DataSet查询创建DataView
    VB.Net返回LINQ to DataSet中指定行后的剩余记录
    VB.Net在LINQ to DataSet中根据字符串的长度排序
    VB.Net使用ToArray()方法强制立即执行LINQ查询
    VB.Net在LINQ to DataSet中使用联接实现交叉表查询
    简单LINQ实例

    | 设为首页 | 加入收藏 | 联系站长 | | 友情链接 | 版权申明 |
    乐博网欢迎各种媒体转载我们的原创作品[转载请注明出处];我们鼓励更多VB.Net开发者一起加入研究与探讨;如发现文章访问错误、内容错误或版权疑问、内容有违相关法律(如涉及政治、色情、反动或散布虚假有害信息)等情况,请及时向我们举报,我们将及时纠正!
    联系邮箱:Shiny#vip.qq.com (#替换为@) QQ交流群: 40797788 [闽ICP备05014267号]