今天在写一个权限管理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;
这样写可以,只是非常郁闷。
大家有什么更好的方法吗?
分享到:
相关推荐
在本篇中,我们将深入探讨C#中的泛型集合及其在解决复杂问题时的应用。 首先,我们要理解什么是集合。集合是一组具有相同类型的对象的容器,如数组或列表。在C#中,System.Collections和System.Collections.Generic...
C#中的泛型接口如`IEnumerable<T>`和泛型类如`List<T>`、`Dictionary, TValue>`是泛型集合的基础。这些接口和类定义了操作数据的一般方法,而`T`则代表一个未指定的类型参数,可以在实例化时指定具体类型。 2. **...
本文将深入探讨C#中泛型集合的概念、优势以及如何使用它们。 一、泛型概述 泛型是C# 2.0引入的一个重要特性,它允许我们在编写类、接口和方法时定义一个或多个类型参数,这些参数可以在实例化时指定具体的类型。...
C#泛型集合是.NET框架中一个非常重要的概念,它为开发者提供了强大的数据处理能力,同时保持了代码的高效性和类型安全。在C#中,泛型集合允许我们在不指定具体数据类型的情况下定义和操作数据结构,这极大地提高了...
在.NET框架中,C#语言提供了丰富的数据结构和容器,其中最常用且强大的就是List、Dictionary和HashSet等泛型集合。这些集合类是基于泛型的,能够提供类型安全的数据存储,大大增强了代码的可读性和效率。接下来,...
1. **类型安全**:泛型保证了在运行时的类型检查,防止了不匹配类型的对象被插入到泛型集合中。 2. **性能提升**:由于泛型避免了类型转换的开销,所以它们通常比非泛型的版本运行得更快。 3. **代码重用**:泛型类...
本文将深入探讨如何使用C#泛型集合来编写程序,并结合实际应用场景,帮助你更好地理解和运用这些概念。 首先,让我们理解什么是泛型。泛型是C#的一个核心特性,它允许我们在定义类、接口和方法时延迟指定类型。这样...
在C#编程语言中,集合和泛型是两个非常重要的概念,它们在开发高效、可维护的代码中扮演着核心角色。本篇文章将深入探讨这两个主题,并通过实例演示其应用场景。 首先,我们来理解什么是集合。在C#中,集合是一组...
本篇文章主要探讨如何在C#中通过使用`DataSet`对象来读取数据库,并将其转换为泛型集合,如`List<T>`。 首先,我们来看一个基本的示例代码,它演示了如何从数据库获取数据并将其绑定到一个`GridView`控件上。`Page_...
例如,C#的泛型集合类如List在运行时可以使用非装箱的值类型,而Java的ArrayList由于类型擦除,对于非引用类型仍需进行装箱操作,这可能导致性能下降。 另一方面,Java的泛型类型擦除带来了一定的灵活性,使得旧的...
1. **创建和初始化泛型集合**:如何使用new关键字实例化泛型集合,如List、Dictionary, TValue>等。 2. **添加元素**:向集合中添加元素的语法,如`list.Add(item)`或`dictionary.Add(key, value)`。 3. **遍历集合*...
在本文中,我们将深入探讨C#泛型的概念、语法和常见用法。 1. **泛型基础概念**: 泛型在C#中主要体现在类、接口、方法和委托上。通过使用泛型,我们可以定义通用的容器或算法,这些容器或算法在运行时能够适应...
5. **泛型集合**: .NET框架提供了许多内置的泛型集合类,如`List<T>`、`Dictionary, TValue>`和`Queue<T>`等。这些集合类提供了强类型的安全性和更好的性能,因为它们在编译时就知道要存储的数据类型。 6. **泛型...
本文将深入探讨如何利用C#的枚举和泛型技术来实现高性能的数据去重。 首先,理解枚举(Enum)。枚举是一种特殊的值类型,用于定义一组相关的命名常量,这些常量通常代表某种特定的分类或状态。在C#中,枚举可以基于...
例如,我们可以创建一个泛型集合类`List<T>`,其中`T`代表一个未指定的类型。当我们实例化`List<T>`时,可以替换`T`为具体的类型,如`List<int>`或`List<string>`。 ```csharp public class MyGenericClass { ...
本主题将深入探讨C#中的泛型、集合、迭代器以及数据结构的应用,这些都是软件开发中的核心概念。 首先,泛型是C#中一个强大的特性,它允许我们在不指定具体类型的情况下编写代码。这样可以提高代码的重用性,减少...
“VT泛型集合字典根据预设键获取值”这一知识点,涉及到C#中的泛型、反射、属性信息和集合操作等多个重要概念。通过理解这些概念,不仅可以掌握代码的具体实现细节,还能深入理解C#编程语言的高级特性,这对于开发...
本文将深入探讨如何在C#中使用泛型和数组排序,并结合面向对象原则,尤其是ASP.NET和.NET框架中的相关概念。 首先,我们需要理解什么是泛型。在C#中,泛型允许我们定义类型参数化的类、接口和方法。这意味着在编写...