走进Linq-Linq to SQL源代码赏析 Table的获取过程2010-11-22 博客园 横刀天笑上一篇我们看到了DataContext是如何初始化的,它需要一个连接对象,还需 要一个MappingSource做映射的配置。在DataContext中我们打交道最多 的也许就是GetTable<TEntity>()方法了,这个方法会获取一个 Table<TEntity>对象,今天我们就来看看这个对象是如何获取的。对于获取Table<TEntity>对象我们还要看看这个DataContext是不 是强类型的,关于强类型的DataContext可以看我前面一篇文章,强类型的 DataContext里包含有几个Table<TEntity>类型的属性,比如我们的库中 有blogs、posts等表,那么你可能就会建立Table<Blog>和 Table<Post>类型的属性(参见前面一篇文章)。在上一章DataContext的 初始化里讲到Init方法的最后一行是InitTables方法的调用。我们首先来看看 InitTables方法的代码:
/// <summary>
/// 初始化数据库中有几个表
/// 从方法实现中意图来看,这个方法主要在定义了强类型的DataContext才有意义
/// 在强类型的DataContext里一般定义了Table<Post>之类的字段来表示数据库中有几个
/// 表,该方法调用DataContext的GetTable方法设置这些字段的值
/// </summary>
/// <param name="schema"></param>
private void InitTables(object schema)
{
//用反射遍历DataContext类(可能是它的子类)里所有的公有实例字段
foreach (FieldInfo info in schema.GetType().GetFields(BindingFlags.Public |
BindingFlags.Instance))
{
//字段类型
Type fieldType = info.FieldType;
//该字段是否是泛型的,并且是Table<>类型的,而且该字段的值为null
if ((fieldType.IsGenericType && (fieldType.GetGenericTypeDefinition() ==
typeof(Table<>))) && (((ITable)info.GetValue(schema)) == null))
{
//获取Table<TEntity>中TEntity的具体类型
Type type = fieldType.GetGenericArguments()[0];
//调用DataContext的GetTable方法得到一个ITable对象
ITable table = this.GetTable(type);
//设置值
info.SetValue(schema, table);
}
}
}