Я застрял с использованием дженериков с 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
Вам нужно указать параметр типового типа после имени метода, который делает этот метод generic.Or вы должны поместить этот метод в общий класс, где T
задан как общий параметр. В противном случае компилятор не знает, что такое T
public IEnumerable<T> GetUsers<T>() where T : DirectoryObject
Вы не можете объявить ограничение "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>