走进Linq-Linq to SQL源代码赏析 Table的获取过程
[1] 走进Linq-Linq to SQL源代码赏析 Table的获取过程
[2] 走进Linq-Linq to SQL源代码赏析 Table的获取过程
[3] 走进Linq-Linq to SQL源代码赏析 Table的获取过程
[2] 走进Linq-Linq to SQL源代码赏析 Table
[3] 走进Linq-Linq to SQL源代码赏析 Table
系列文章导航:
不能不说的C#特性-迭代器(下),yield以及流的延迟计算
走进Linq-Linq to SQL How do I(1)
走进Linq-Linq to SQL How do I(2)
走进Linq-Linq to SQL How do I(3)
走进Linq-Linq to SQL源代码赏析 Table
走进Linq-Linq to SQL源代码赏析之Provider的初始化
走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq
上一篇我们看到了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);
}
}
}
/// 初始化数据库中有几个表
/// 从方法实现中意图来看,这个方法主要在定义了强类型的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);
}
}
}