六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 57|回复: 0

C#中的接口和泛型集合探讨

[复制链接]

升级  1.2%

160

主题

160

主题

160

主题

进士

Rank: 4

积分
506
 楼主| 发表于 2013-1-27 04:41:40 | 显示全部楼层 |阅读模式
今天在写一个权限管理API的实现类,碰到了一个很有意思的问题。
具体情况是这样的:
 
权限管理API有一个需要实现的抽象方法:
public IList<IPermission> GetPermissions();
 
需要注意的是IList<IPermission>这个泛型集合的类型参数IPermission是个接口。
 
现在我要在实现类中使用NHibernate去实现这个方法,一开始我觉得很简单。
因为有一个实体类Permission实现了IPermission接口,于是很直接的写法:
return NHibernateSession.CreateCriteria(typeof(Permission)).List<Permission>();
 
编译这段代码,大家会发现中招了:
 
错误    137    无法将类型“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;
 
这样写可以,只是非常郁闷。
 
大家有什么更好的方法吗?
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表