我在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
答案 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>