Entity Framework/LINQ to SQL Data Binding是否使用反射?

Ada*_*son 8 c# vb.net reflection entity-framework linq-to-sql

如果之前有人问过,请原谅我; 我做了一个搜索,但找不到任何具体回答这个问题,但我很乐意被推荐.

我正在看一下Entity Framework和LINQ to SQL,虽然我喜欢这些系统(当然还有LINQ集成)但我对数据绑定方面有点怀疑.我已经采取了查询结果,并检查他们,他们似乎并没有执行标准的.NET列表绑定接口(IBindingList以及更重要的ITypedList),导致我相信,他们结合到网格(或其他任何东西)是怎么回事使用反射来获取/设置我的实体属性.这似乎是一个相对昂贵的操作,特别是当所有代码都生成并且可以实现接口时.

有没有人对此有任何见解?反射用于获取/设置属性的值吗?如果是,这是否会产生明显的性能影响,是否有人知道他们为什么选择这条路线?

编辑

我实际上专注于是否在ITypedList某个地方实现,因为这是有能力提供一种显式机制来定义和与属性交互而不需要求助于反射.虽然我没有LINQ to SQL项目,但我确实检查了一个简单的Entity Framework实体查询结果,但它似乎没有实现ITypedList.有谁知道我是不是只是看错了,或者如果不是为什么会这样?

编辑2

在接受了Marc的回答之后,我认为如果我发布了一些我用来无缝实现其解决方案的简单代码,那么对其他人可能会有所帮助.我将以下内容放在我的类的静态构造函数中:

public static ContextName()
{
    foreach(Type type in System.Reflection.Assembly.GetExecutingAssembly()
        .GetTypes())
    {
        if (type.GetCustomAttributes(typeof(System.Data.Linq.Mapping
            .TableAttribute), true) != null)
        {
            System.ComponentModel.TypeDescriptor.AddProvider(
                new Hyper.ComponentModel.HyperTypeDescriptionProvider(
                    System.ComponentModel.TypeDescriptor.GetProvider(
                        type)), 
                type);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然这是针对LINQ to SQL的,但我确信可以为Entity Framework编写等效版本.这将扫描程序集中包含该Table属性的任何类型,并为每个类型添加自定义提供程序.

Mar*_*ell 3

支持 LINQ 等的表达式 API 是基于反射 ( MemberInfo),而不是组件模型 (PropertyDescriptor等) - 因此对ITypedList. 相反,内容是从TinIQueryable<T>等推断出来的IEnumerable<T>IList<T>

您可能得到的最接近的是IListSource,但这仍然只是正确类型化列表的浅层包装。

如果运行时绑定(到PropertyDescriptor)的性能是关键,您可能需要查看HyperDescriptor - 它使用Reflection.EmitTypeDescriptionProvider包装组件模型。

关于“为什么”等;请注意,在几乎所有使用 LINQ-to-SQL 和 EF 的情况下,Expression(或“创建和设置成员”部分)都会在调用之前编译为委托 - 因此在运行时没有巨大的反射成本。同样,对于 LINQ-to-Objects,一切都已编译(由 C# 编译器)。