NHibernate无法将类型“System.Collections.Generic.IList<T>”隐式转换为“System.Collections.Generic.IList<IT>

API有一个需要实现的抽象方法:

public IList<IPermission> GetPermissions();

需要注意的是IList<IPermission>这个泛型集合的类型参数IPermission是个接口。

现在我要在实现类中使用NHibernate去实现这个方法,一开始我觉得很简单。

因为有一个实体类Permission实现了IPermission接口,于是很直接的写法:

return NHibernateSession.CreateCriteria(typeof(Permission)).List<Permission>();

编译这段代码,错误:

无法将类型“System.Collections.Generic.IList<Permission>”隐式转换为“System.Collections.Generic.IList<IPermission>”。存在一个显式转换(是否缺少强制转换?)   

既然说缺少强制转换,OK。我就将它强制转换一下。 

return NHibernateSession.CreateCriteria(typeof(Permission)).List<Permission>() as IList<IPermission>;

 这回编译通过, 于是调试,不幸的是,返回结果是null。

解决:

笨方法:

IList<Permission> permissions = NHibernateSession.CreateCriteria(typeof(Permission)).List<Permission>();

IList<IPermission> ipermissions = new IList<IPermission>();

foreach ( Permission permission in permissions )
{
   ipermissions.Add(permission);
}
return ipermissions;

保留参考:

1.
ipermissions.AddRange((IPermission[])permissions.ToArray());

2. 
ipermissions.AddRange(permissions.Cast<IPermission>());

3.
Converter<Permission, IPermission> converter = delegate(Permission permission) { return permission as IPermission; }; 
 List<IPermission> iPermissions = permissions.ConvertAll<IPermission>(converter); 
原文地址:https://www.cnblogs.com/shy1766IT/p/5480542.html