如何在.NET 2.0中编写一个简单的类似表达式的类?

时间:2010-07-07 18:25:02

标签: vb.net .net-2.0 c#-2.0 expression class-library

我目前正在使用.NET 2.0 Visual Basic。当前项目是一个Active Directory Wrapper类库,我在其中有一个Searcher(Of T)泛型类,我希望用它来搜索底层目录中的对象。

在这个Searcher(Of T)课程中,我有以下方法:

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...

最让我感兴趣的是 Find()方法,我可以将属性和值传递给它,并希望从此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 个答案:

答案 0 :(得分:1)

有趣的问题。这是一个依赖于语言的功能,所以如果没有IDE /编译器的一些巧妙的技巧,我不会发现这种情况。

但是你可以在Find方法上有可选的重载(vb.net对此有好处),然后手动创建搜索字符串以获得结果。

最后,您可以使用lambda函数,但仅限于.net 3.5及更高版本。即使如此,它仍然需要您的搜索者公开一组初步数据,以便您可以恢复表达式树并构建查找字符串。

更新

我刚刚玩了Reflection,看看我是否可以检索传递的参数,并根据它们是否存在动态构建一个字符串。由于编译代码没有引用名称,这似乎不可能。

刚才使用的代码是:

'-- 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