代码之家  ›  专栏  ›  技术社区  ›  Will Marcouiller

如何在.NET2.0中编写类这样的简单表达式?

  •  2
  • Will Marcouiller  · 技术社区  · 14 年前

    Searcher(Of T)

    在这个 搜索者(T) I类有以下方法:

    Private Function GetResults() As CustomSet(Of T)
    Public Function ToList() As CustomSet(Of T)
    Public Function Find(ByVal ParamArray filter() As Object) As CustomSet(Of T)
    // And some other functions here...
    

    我最感兴趣的是 查找() 方法,我可以将属性和值传递给该方法,并希望从此filter()ParamArray参数分析LDAP查询。事实上,我能想到的是:

    Public Sub SomeSub()
        Dim groupSearcher As Searcher(Of Group) = New Searcher(Of Group)()
        Dim groupsSet as CustomSet(Of Group) = groupSearcher.Find("Name=someName", "Description=someDescription")
    
        // Working with the result here...
    End Sub
    

    Public Sub SomeSub()
        Dim groupSearcher As Searcher(Of Group) = New Searcher(Of Group)()
        Dim groupsSet As CustomSet(Of Groupe) = groupSearcher.Find(Name = "someName", Guid = someGuid, Description = "someDescription")
    
        // And work with the result here...
    End Sub
    

    总之,我想提供一些 Expression 功能我的用户,除非它是太多的工作,因为这个项目不是最重要的一个,我没有像2年的时间来开发它。我认为我最好写些 CustomExpression 可以将参数传递给某些函数或子函数。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Tom    14 年前

    有趣的问题。这是一个依赖于语言的特性,因此如果没有IDE/编译器的巧妙技巧,我看不出会发生这种情况。

    最后,您可以使用lambda函数,但只能在.NET3.5及更高版本中使用。即使如此,也需要搜索者公开一组初步的数据,以便恢复表达式树并构建find字符串。

    我只是在玩反射,看看是否可以检索传递的参数,并根据它们是否存在动态地构建一个字符串。这似乎是不可能的,因为编译后的代码没有引用这些名称。

    刚才使用的代码是:

    '-- Get all the "parameters"
    Dim m As MethodInfo = GetType(Finder).GetMethod("Find")
    Dim params() As ParameterInfo = m.GetParameters()
    '-- We now have a reference to the parameter names, like Name and Description
    

    http://channel9.msdn.com/forums/TechOff/259443-Using-SystemReflection-to-obtain-parameter-values-dynamically/

    令人烦恼的是,要恢复发送的值是不可能的(很容易),所以我们必须坚持以非动态的方式构建字符串。

    Public Sub Find( _
                   Optional ByVal Name As String = "", _
                   Optional ByVal Description As String = "")
    
        Dim query As String = String.Empty
        If Not String.IsNullOrEmpty(Name) Then
            query &= "Name=" & Name
            '-- ..... more go here with your string seperater.
        End If
    End Sub