正确使用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
您需要在方法名之后指定泛型类型参数,这使得该方法泛型。或者你必须把这个方法放到一个泛型类中,其中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>