使用reflection过滤/删除EF5导航属性

我有下面的代码来获得通过的所有通用实体的属性。我认为这样的属性将成为一个excel报告的伟大标题。 但是当我使用它时,我得到了一些“导航”属性。 我想过滤它们,因为他们搞乱了报告。 这里是一些代码…

DataTable dataTable = new DataTable(typeof(TEntity).Name); //Get properties / field names PropertyInfo[] Props = typeof(TEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance); //Add props to datatable foreach (PropertyInfo prop in Props) dataTable.Columns.Add(prop.Name); 

所以代码继续将其他行添加到数据表中,然后我使用它将数据发送到出色的NPOI免费的Excel导出工具。

有理想的BindingFlags属性,将允许我忽略这些东西

 | !BindingFlags.Navigation 

我也不一定需要其他2,因为我看到它们似乎有或没有他们相同的细节。

如果没有BindingFlags属性,有没有办法扩展它。

如果没有,那么有没有其他的标准方法可靠地检测它们,所以我可以过滤掉它们。

我听说其中一些包含“导航”作为前缀,或几乎总是虚拟的,但虽然我的虚拟似乎“几乎”部分担心我。 这就是为什么我不想做这样的事情:

 PropertyInfo[] Props = typeof(TEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(p => !p.GetGetMethod().IsVirtual && !p.GetGetMethod().IsFinal).ToArray(); 

不过,我没有“导航”的前缀,我可以看到,但如果他们这样做,我不相信这也会给我正确的方式。

也许我对上述两个人是错误的,或者没有在正确的地方寻找。

我也完成了一些生成连接到repo的“ViewModel”的行,以从模型中获取数据并填充ViewModel。 然后发送到我的报告引擎。 这似乎更灵活,因为我可以使用它有点像预览如果我附加一个视图。 这听起来像正确的路要走吗?

提前致谢…

就像Francis所要求的一样,你可以使用DbContext的元数据来获得给定实体types的导航属性:

 public static PropertyInfo[] GetNavigationProperties<TEntity>(DbContext context) where TEntity: class { var objContext = ((IObjectContextAdapter)context).ObjectContext; var elementType = objContext.CreateObjectSet<TEntity>().EntitySet.ElementType; return elementType.NavigationProperties.Select(prop => typeof(TEntity).GetProperty(prop.Name)).ToArray(); } 

然后你可以过滤你的属性,不包括导航的属性,你的代码可能是这样的:

 var dataTable = new DataTable(typeof(TEntity).Name); var navProperties = GetNavigationProperties<TEntity>(ctx); var props = typeof(TEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance); //Add props to datatable foreach (var prop in props.Except(navProperties)) dataTable.Columns.Add(prop.Name);