WEB开发网
开发学院软件开发C语言 Effective C# 原则41:选择DataSet而不是自定义的... 阅读

Effective C# 原则41:选择DataSet而不是自定义的数据结构

 2009-02-19 08:17:41 来源:WEB开发网   
核心提示: int val = MyDataSet.table1.Rows[ 0 ].total;当你看明白了类型化的DataSet内部的C#实现时,就会知道这是完美的,Effective C# 原则41:选择DataSet而不是自定义的数据结构(2),它封装了已经存在的DataSet,而且在弱类型的

int val = MyDataSet.table1.Rows[ 0 ].total;

当你看明白了类型化的DataSet内部的C#实现时,就会知道这是完美的。它封装了已经存在的DataSet,而且在弱类型的访问基础上添加了强类型访问。你的用户还是可以用弱类型API。但这并不是最好的。

与它同时存在的,我会告诉你我们放弃了多少东西。我会告诉你DataSet类里面的一些功能是如何实现的,也就是在我们自己创建的自定义集合中要使用的。你可能会觉得这很困难,或者你觉得我们根本用上不同DataSet的所有功能,所以,代码并不会很长。OK,很好,我会写很长的代码。

假设你要创建一个集合,用于存储地址。每一个独立的元素必须支持数据绑定,所以你我创建一个具有下面公共属性的结构:

public struct AddressRecord
{
 private string _street;
 public string Street
 {
  get { return _street; }
  set { _street = value; }
 }
 private string _city;
 public string City
 {
  get { return _city; }
  set { _city = value; }
 }
 private string _state;
 public string State
 {
  get { return _state; }
  set { _state = value; }
 }
 private string _zip;
 public string Zip
 {
  get { return _zip; }
  set { _zip = value; }
 }
}

下面,你要创建这个集合。因为我们要类型安全的集合,所以我们要从CollectionsBase派生:

public class AddressList : CollectionBase
{
}

CollectionBase 支持IList 接口,所以你可以使用它来进行数据绑定。现在,你就发现了你的第一个问题:如果地址为空,你的所有数据绑定行就失败了。而这在DataSet里是不会发生的。数据绑定是由基于反射的迟后绑定代码组成的。控件使用反射来加载列表里的第一个元素,然后使用反射来决定它的类型以及这个类型上的所有成员属性。这就是为什么DataGrid可以知道什么列要添加。它会在集合中的第一个元素上发现所有的公共属性,然后显示他们。当集合为空时,这就不能工作了。你有两种可能来解决这个问题。第一个方法有点丑,但是一个简单的方法:那就是不充许有空列表存在。第二个好一些,但要花点时间:那就是实现ITypedList 接口。ITypedList 接口提供了两个方法来描述集合中的类型。GetListName 返回一个可读的字符串来描述这个列表。GetItemProperties 则返回PropertyDescriptors 列表,这是用于描述每个属性的,它要格式化在表格里的:

上一页  1 2 3 4  下一页

Tags:Effective 原则 选择

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接