正确使用IEnumerable <t> </t>

时间:2014-05-16 17:54:32

标签: c#

我在IEnumerable

中使用泛型

我有一个基类

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

其中有两个派生类

    public class User : DirectoryObject
    {
        ...
    }

    public class Group : DirectoryObject
    {
        ...
    }

我最初使用两种不同的方法来获取用户和组对象......

    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 个答案:

答案 0 :(得分:2)

您需要在方法名称之后指定泛型类型参数,这使得此方法通用。或者您必须将此方法放入通用类中,其中T被指定为泛型参数。否则编译器没有关于T是什么的想法。

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

答案 1 :(得分:0)

您不能在非泛型方法上声明“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>