查找属于同一泛型类的所有属性

本文关键字:属性 泛型类 属于 查找 | 更新日期: 2023-09-27 18:02:53

如果您不熟悉实体框架,它会生成一个类,看起来像

public partial class contextontext : DbContext
{
    public virtual DbSet<foo> foo { get; set; }
    public virtual DbSet<bar> bar { get; set; }
    //Etc, there could be lots of these DbSet properties
} 

我试图建立一个有DbSet<T>集合的类型列表,但我不确定如何检查泛型类型。我得到它的工作使用PropertyType.ToString().StartsWith("System.Data.Entity.DbSet`1"),但这似乎是一个混乱和不必要的复杂的方式来做它。这是我用来获取属性的完整LINQ。

foreach (var property in context.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).Where(p => p.PropertyType.ToString().StartsWith("System.Data.Entity.DbSet`1")))
{
   Type type = property.PropertyType.GenericTypeArguments[0];
   //other stuff...
}

我在属性对象中四处搜索,但没有找到任何线索。那里有一个Type,但这总是通用DbSet的类型特定实现(应该是这样)。无论它是什么类型,我如何检查它是否是泛型集合?

查找属于同一泛型类的所有属性

我想你只是想:

var propertyType = property.PropertyType;
if (propertyType.IsGenericType
  && propertyType.GetGenericTypeDefinition() == typeof(DbSet<>))
{
  // ...
}

我现在看到你的Where远远在你的代码的右边。那就是:

.Where(p => p.PropertyType.IsGenericType
  && p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>))

方法GetGenericTypeDefinition从具体构造("封闭")泛型(例如DbSet<foo>)到类型的定义(这里是DbSet<TEntity>)。