Как я могу превратить метод в шаблон c, где я передаю класс и строку? - PullRequest
1 голос
/ 21 марта 2020

У меня есть метод, который я вызываю следующим образом:

    var Start = await cosmosManager.GetDocumentItemsForLogStartAsync();

    public async Task<List<LogStart>> GetDocumentItemsForLogStartAsync()
    {
        List<LogStart> Items2 = new List<LogStart>();
        try
        {
            collectionLink = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
            var query = client.CreateDocumentQuery<LogStart>(collectionLink).Where(x => x.Activity == "Start").AsDocumentQuery();
            while (query.HasMoreResults)
            {
                var retrivedData2 = await query.ExecuteNextAsync<LogStart>();
                Items2.AddRange(retrivedData2);
            }
        }
        catch (DocumentClientException ex)
        {
            Debug.WriteLine("Error: ", ex.Message);
        }
        return Items2;
    }

Я хотел бы иметь возможность вызывать метод следующим образом:

var Start = await cosmosManager.GetDocumentItemsForLogAsync(LogStart, "Start");
var Views = await cosmosManager.GetDocumentItemsForLogAsync(LogViews, "Views");
var Feedback = await cosmosManager.GetDocumentItemsForLogAsync(LogFeedback, "Feedback");

Где LogStart LogViews и LogFeedback - это все классы.

Есть ли способ, которым я могу изменить свой метод, чтобы это могло сработать, чтобы мне не пришлось создавать три разных метода?

1 Ответ

2 голосов
/ 21 марта 2020

Использование C# обобщений.

Кроме того, в C# локальные переменные должны быть camelCased, а не PascalCased.

Я предполагаю, что ваше предложение Where является указанием типа c, что означает, что вам нужно переместить это в параметр. Я предполагаю, что это должно быть Expression<> вместо Func<> вместо простого Func<> (это зависит от того, используете ли вы IQueryable<T> или IEnumerable<T>).

    public async Task<List<T> GetDocumentItemsAsync<T>( Expression<Func<T,Boolean>> predicate )
    {
        List<T> list = new List<T>();
        try
        {
            collectionLink = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
            var query = client.CreateDocumentQuery<T>(collectionLink)
                .Where( predicate )
                .AsDocumentQuery();

            while (query.HasMoreResults)
            {
                var retrivedData2 = await query.ExecuteNextAsync<T>();
                list.AddRange(retrivedData2);
            }
        }
        catch (DocumentClientException ex)
        {
            Debug.WriteLine("Error: ", ex.Message);
        }
        return list;
    }

Используется вот так:

var start = await cosmosManager.GetDocumentItemsAsync<LogStart>( x => x.Activity == "Start" );

var views = await cosmosManager.GetDocumentItemsAsync<LogViews>( x => x.Activity == "Views" );

var feedback = await cosmosManager.GetDocumentItemsAsync<LogFeedback>( x => x.Activity == "Feedback" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...