我目前正在使用.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
的东西,可以将参数传递给某些函数或子函数。
感谢任何可能让我实现目标的建议!
答案 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
令人讨厌的是,恢复发送的值并非(轻松),因此我们必须坚持以非动态的方式构建字符串。
一个简单的可选方法如下:
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