Как написать простой Expression-подобный класс в .NET 2.0? - PullRequest
2 голосов
/ 07 июля 2010

В настоящее время я работаю в .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 () , которому я могу передать свойство и значения и хотел бы проанализировать мой запрос LDAP из этого фильтра ()Параметр ParamArray.На самом деле все, что я могу понять, это:

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 Ответ

1 голос
/ 24 ноября 2010

Интересный вопрос.Это функция, зависящая от языка, поэтому я не вижу, чтобы это происходило без какой-то хитрой хитрости IDE / компилятора.

Однако вы можете иметь дополнительные перегрузки в вашем методе Find (vb.net хорош для этого), затем сделайте строку поиска вручную, чтобы получить результат.

Наконец, вы можете использовать лямбда-функции, но только в .net 3.5 и выше.Тем не менее, вашему поисковику потребуется предоставить предварительный набор данных, чтобы вы могли восстановить дерево выражений и создать строку поиска.

ОБНОВЛЕНИЕ

Я только что поиграл с этимОтражение, чтобы увидеть, могу ли я получить переданные параметры и динамически создать строку в зависимости от того, существуют ли они.Это кажется невозможным из-за того, что скомпилированный код не ссылается на имена.

Этот код только что использовался:

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