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

本文探讨了在使用NHibernate框架实现权限管理API时遇到的一个关于泛型接口转换的问题,并提供了一种解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在写一个权限管理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;

 

这样写可以,只是非常郁闷。

 

大家有什么更好的方法吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值