Pageiterator als generische Erweiterungsmethode auf getaSync ()C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Pageiterator als generische Erweiterungsmethode auf getaSync ()

Post by Anonymous »

Die Graph -API kehrt für verschiedene Anforderungen (Benutzer, Gruppen usw.) A Seite zurück. Dieses Element enthält die erste Häufigkeit von Elementen und die NextPageRequest Eigenschaft, mit der der nächste GetAsync () rufen kann. Zuvor hatten wir eine Reihe von Helfer -Erweiterungsmethoden, der diesen generischen Ansatz fehlt und für jede Art von Typ separat mehr oder weniger wie folgt implementiert wird: < /p>

Code: Select all

public static async Task GetAll(this Task collectionTask)
{
// Argument checks, error handling and parameter for max item count omitted for better readability
var collectionPage = await collectionTask;

var start = (IEnumerable)(collectionPage);

while (collectionPage.NextPageRequest != null)
{
collectionPage = await collectionPage.NextPageRequest.GetAsync();
start = start.Concat(collectionPage);
}

return start;
}
< /code>
Diese Art von Erweiterungsmethoden, die so etwas schreiben dürfen: < /p>
var currentGroupMembers = await serviceClient.Groups[azureGroup.Id].Members.Request().GetAsync().GetAll();
Aufgrund der Tatsache, dass jede Art von Typ seinen eigenen Typ von ... Sammlung zurückgibt ... Seite Wir mussten dieselbe Methode schreiben und nur die angegebenen Typen ersetzen. Während es ziemlich einfach ist, eine solche Funktion zu schreiben: < /p>

Code: Select all

public static async Task GetAllWithPageIterator(this Task pageTask, IBaseClient baseClient)
{
// Argument checks, error handling and parameter for max item count omitted for better readability
var page = await pageTask;
var allElements = new List();

var iterator = PageIterator.CreatePageIterator(baseClient, page, item =>
{
allElements.Add(item);
return true;
});

await iterator.IterateAsync();
return allElements;
}
< /code>
Sie können es einfach nicht verwenden: < /p>
// Extension method explicitly called to better show error message.
var task = serviceClient.Groups[azureGroup.Id].Members.Request().GetAsync();
await IGraphServiceCollectionPageExtensions.GetAllWithPageIterator(task, serviceClient);

Argument 1: cannot convert from 'System.Threading.Tasks.Task' to 'System.Threading.Tasks.Task'
Aber iGroupMembersCollectionWitHreferencesPage implementiert microsoft.graph.icollectionPage , aber ich denke, der Grund ist der Außentyp -Aufgabe Vermeidet die Verwendung der Nutzung als generische Erweiterung. Wenn Sie die oben genannte Erweiterungsmethode neu schreiben, um nur den iCollectionPage zu verwenden, funktioniert alles wie erwartet. Das würde jedoch die Erweiterungsmethode auflösen, die immer als zwei Liner verwendet werden soll: < /p>

Code: Select all

var firstPage = await serviceClient.Groups[azureGroup.Id].Members.Request().GetAsync();
var allItems = firstPage.GetAllWithPageIterator(firstPage, serviceClient);
Während dies funktioniert, sieht es für mich nur schlecht aus (auch wenn Sie schreiben würden (warten Sie ServicEclient ... getaSync ()). Getall ... ). Es sieht einfach so aus, als würde man nicht wirklich übereinstimmen und eine echte fließende Lösung wie getaSync (). GetAll () mit generischen Einschränkungen wäre großartig.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post