正确使用IEnumerable

本文关键字:IEnumerable | 更新日期: 2023-09-27 18:03:48

我被困在使用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);
    }

在写了很多重复的User和Group组合之后,我意识到我可以把它和一个通用的组合在一起,就像这样…

    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

正确使用IEnumerable<T>

您需要在方法名之后指定泛型类型参数,这使得该方法泛型。或者你必须把这个方法放到一个泛型类中,其中T被指定为一个泛型参数。否则编译器不知道T是什么

public IEnumerable<T> GetUsers<T>() where T : DirectoryObject

不能在非泛型方法上声明"where"约束。尽管GetUsers()的返回类型是通用的IEnumerable<T>,但该方法不接受类型参数,因此不知道T是什么。

您可以创建一个"直通"泛型类来缓解这个问题,并指定您的约束:

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

该类指定T在创建时是什么,因此允许非泛型函数GetUsers()返回IEnumerable<T>