2

これまでのところ、tenantName列を検索するメソッド(OnSearchButtonClick)があります。

Private Sub OnSearchButtonClick(ByVal searchValue As String)
            _filteredTenants = New ListCollectionView(_allTenants.Cast(Of TenantOverviewDto).Where(Function(p) p.TenantName.ToUpper().StartsWith(searchValue.ToUpper())).ToList())
 End Sub

このメソッドでは、TenantOverviewDtoの特定の列の名前を持つパラメーターとして別の文字列を渡します。たとえば、「Runners」というグループでテナントを検索する場合は、searchValueパラメーターに「Runners」を渡し、新しいパラメーターにgroupを渡してから、グループ列を検索するクエリを実行します。(2番目のパラメーターがTenantNameの場合、TenantName列を確認する必要があります)

誰かが私たちがこれをどのように達成できるかについての考えを持っていますか?すべての助けは非常にありがたいです。

4

3 に答える 3

0

この場合、リフレクション ソリューションはよりシンプルで簡潔なので、それを使用することをお勧めします。

ただし、動的式を使用した C# ソリューションを投稿するのは興味深いと思いました。

private void OnSearchButtonClick(string propertyName, string searchValue)
{
    var parameter = Expression.Parameter(typeof(TenantOverviewDto), "p");

    var toUpperMethodInfo = typeof(string).GetMethods()
        .Single(m => m.Name == "ToUpper" && !m.GetParameters().Any());

    var startsWithMethodInfo = typeof(string).GetMethods()
        .Single(m => m.Name == "StartsWith" && m.GetParameters().Count() == 1);

    var expression =
        Expression.Call(
            Expression.Call(
                Expression.Property(parameter, propertyName), 
                toUpperMethodInfo),
            startsWithMethodInfo,
            Expression.Constant(searchValue.ToUpper())
        );

    var compiledCondition = Expression.Lambda<Func<TenantOverviewDto, bool>>
        (expression, parameter).Compile();

    _filteredTenants = new ListCollectionView(
        _allTenants.Cast<TenantOverviewDto>().Where(compiledCondition).ToList());
}

このアプローチは、この場合に必要なものに対して複雑すぎます。ただし、変数プロパティを定数文字列と比較するだけではなく、条件がより複雑な場合に便利です。

于 2012-11-05T15:32:20.287 に答える