Правильное использование IEnumerable <T>

1

Я застрял с использованием дженериков с IEnumerable

У меня есть базовый класс

    public class DirectoryObject //Microsoft.Azure.ActiveDirectory.GraphClient
    {
        ...
    }

где есть два производных класса

    public class User : DirectoryObject
    {
        ...
    }

    public class Group : DirectoryObject
    {
        ...
    }

Первоначально я использовал два отдельных метода для получения объектов User и Group...

    public User GetUser(string objectId)
    {
        return _graphConnection.Get<User>(objectId);
    }


    public Group GetGroup(string objectId)
    {
        return _graphConnection.Get<Group>(objectId);
    }

После написания много повторяющихся комбинаций "Пользователь" и "Группа", я понял, что могу просто объединить его с общим типом...

    public T Get<T>(string objectId) where T : DirectoryObject
    {
        return _graphConnection.Get<T>(objectId);
    }

Но мне трудно преобразовать этот сегмент здесь в общий IEnumerable...

    public IEnumerable<User> ListUser()
    {
        PagedResults pagedResults = _graphConnection.List<User>(null, null);
        return pagedResults.Results.OfType<User>();
    }

    public IEnumerable<Group> ListGroup()
    {
        PagedResults pagedResults = _graphConnection.List<Group>(null, null);
        return pagedResults.Results.OfType<Group>();
    }

Я думал о том, как...

    public IEnumerable<T> List() where T : DirectoryObject
    {
        PagedResults pagedResults = _graphConnection.List<T>(null, null);
        return pagedResults.Results.OfType<T>();
    }

Но я не могу заставить его скомпилировать, я чувствую, что мне не хватает чего-то очевидного, но сейчас я рисую пробелы. Ошибка здесь:

    public IEnumerable<T> List() where T : DirectoryObject
Теги:

2 ответа

2
Лучший ответ

Вам нужно указать параметр типового типа после имени метода, который делает этот метод generic.Or вы должны поместить этот метод в общий класс, где T задан как общий параметр. В противном случае компилятор не знает, что такое T

public IEnumerable<T> GetUsers<T>() where T : DirectoryObject
  • 0
    +1 Ну, не «так же хорошо», как на самом деле указано после имени метода. В других местах он просто используется (по крайней мере, с точки зрения метода, с точки зрения типа возвращаемого значения, это естественно указывается в возвращаемом типе).
  • 0
    @ Selman22 - Спасибо. Это покончило с моей ошибкой компилятора!
Показать ещё 5 комментариев
0

Вы не можете объявить ограничение "where" для не общего метода. Несмотря на то, что возвращаемый тип GetUsers() является общим IEnumerable<T>, метод не принимает никакого параметра типа, поэтому не известно, что такое T

Вы можете создать универсальный класс "pass-through", чтобы облегчить эту проблему и указать ваше ограничение:

public class GenericDirectoryObject<T> : DirectoryObject
{
    public IEnumerable<T> GetUsers()
    {
        PagedResults pagedResults = _graphConnection.List<T>(null, null);
        return pagedResults.Results.OfType<T>();
    }
}

Этот класс указывает, что T находится на создании, поэтому позволяет GetUsers() функции GetUsers() возвращать IEnumerable<T>

  • 0
    Ой, только что видел, что уже есть принятый ответ ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню