2010-02-01 32 views
4

这是my question from earlier this morning的深入延续,我仍然难以理解。我为我的应用程序使用强类型的DataContext,虽然它发出警告,但它神奇地工作。它是如何做到的?强类型DataContext是如何工作的?

下面是通常用于使用LINQ to SQL连接到数据库的代码。

class MyDatabase : DataContext { 
    public Table<Widget> Widgets; 
    public Table<Car> Cars; 

    public MyDatabase (string connection) : base(connection) { } 
} 

即使它发出警告,它仍然可以使用。人们可以使用开始从它读:

using (var db = new MyDatabase(connectionString)) { 
    foreach (var w in db.Widgets) 
    Console.WriteLine(w); 
} 

Widgets似乎是MyDatabase类的字段。而在我的代码中,我没有把它分配给任何东西。但在其他地方,我正在阅读,它有价值。为什么?

在LINQ到SQL的其他实例,包括Visual Studio 2008中的DBML布局工具生成的代码,数据上下文类可能是这样的:

public partial class MyDatabase : DataContext { 
    public Table<Widget> Widgets { 
    get { 
     return GetTable<Widget>(); 
    } 
    } 
} 

通知partialGetTable列入。 partial是必要的吗?

我假设我的第一个例子最终通过调用GetTable工作,但是这个代码来自哪里?我的数据上下文类的字段是如何填充数据的?

回答

3

如果它们不是属性,唯一合乎逻辑的结论是基础构造函数已经分配它们。意想不到,也许,但并非不可能。

partial允许您将多个代码文件合并到一个类中;你只需要它,如果你的分隔你的代码文件(通常为设计师)。

一些挖掘在反射器示出了构造函数调用到private void InitTables(object schema),它不恰好此(反映在田野,经由GetTable(Type)分配它们)。

+0

Muy bueno!那么,从今天上午回答我的问题,这是虚假吗?尽管编译器无法感知构造函数中的反射,对吧? – 2010-02-01 20:00:20

+0

@Mark - 正确。警告不正确:编译器无法检测反射。 – 2010-02-01 20:40:24

相关问题