2

現在、.NET 2.0VisualBasicで作業しています。現在のプロジェクトはActiveDirectoryラッパークラスライブラリであり、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、いくつかの関数やサブにパラメーターを渡すことができるようなものを書くことだと思います。

私の目標につながる可能性のある提案をありがとう!

4

1 に答える 1

1

興味深い質問です。これは言語に依存する機能であるため、IDE/コンパイラの巧妙なトリックなしではこれが発生することはありません。

ただし、Findメソッドにオプションのオーバーロードを設定して(vb.netがこれに適しています)、検索文字列を手動で作成して結果を取得することもできます。

最後に、ラムダ関数を使用できますが、.net3.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
于 2010-11-24T10:08:12.343 に答える