Делегированные разрешения имеют значение только при вызове API в контексте пользователя.
Поскольку вы используете учетные данные клиента, пользователь отсутствует. Применяются только разрешения приложения, поэтому установите правильные разрешения там.
Кроме того, поскольку у вас есть асинхронная функция, лучше также дождаться токена:
var authenticationResult = await authenticationContext.AcquireTokenAsync("https://graph.microsoft.com", clientCredential);
Методы расширения позволяют расширять существующие классы, не полагаясь на наследование или изменяя исходный код класса. Это означает, что если вы хотите добавить некоторые методы в существующий класс String, вы можете сделать это довольно легко. Вот пара правил, которые следует учитывать при принятии решения о том, использовать или нет методы расширения:
Методы расширения нельзя использовать для переопределения существующих методов
Метод расширения с тем же именем и сигнатурой, что и у метода экземпляра, не будет вызываться
Концепция методов расширения не может быть применена к полям, свойствам или событиям.
Используйте методы расширения экономно ... чрезмерное использование может быть плохим!
Я использую методы расширения, когда это имеет смысл. Если вы управляете классом и его кодом, вам обычно не нужны методы расширения.
Если вы не используете , метод расширения может быть полезен.
Я часто использую методы расширения для перечислений [Flags]. Если у вас есть перечисление на основе флагов, существует довольно большое выражение, необходимое для определения, имеет ли значение перечисления определенный установленный флаг. И поэтому я создаю следующий метод расширения при построении перечисления [Flags]:
[Flags]
public enum MyEnum
{
FlagA,
FlagB,
// etc.
}
public static class MyEnumExt
{
public static bool HasFlags(this MyEnum item, MyEnum query)
{
return ((item & query) == query);
}
}
Таким образом мой код выглядит следующим образом:
MyEnum flags = MyEnum.FlagA;
if(flags.HasFlags(MyEnum.FlagA))
{
// handle FlagA
}
Вместо:
MyEnum flags = MyEnum.FlagA;
if((flags & MyEnum.FlagA) == MyEnum.FlagA)
{
// handle FlagA
}
раз использовать методы расширения:
Для примера второй точки ; у вас может быть метод расширения для IList
(например, Sort
), который может быть полностью записан с использованием существующих членов IList
.. , так зачем кому-то еще что-то писать? Это основной блок LINQ, который позволил Microsoft предоставить гораздо больше функциональных возможностей, ничего не нарушая.
Времена до не используют методы расширения: