zoukankan      html  css  js  c++  java
  • 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); 
  • 相关阅读:
    js语法学习(变量类型,循环,判断语句,函数)
    使用IIS Server Farms搭建应用服务负载均衡
    Vue SSR学习
    Vue-3D-Model:用简单的方式来展示三维模型
    vue中的$EventBus.$emit、$on的应用
    Vue.js系列:生命周期钩子
    浅谈vue学习之组件通信
    vue中的provide/inject讲解
    浅谈vue$router 和 $route的区别
    vue 父子component生命周期
  • 原文地址:https://www.cnblogs.com/shy1766IT/p/5480542.html
Copyright © 2011-2022 走看看