查找属于同一泛型类

时间:2015-07-14 20:30:38

标签: c# generics

如果您不熟悉Entity Framework,它会生成一个类似于

的类
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的类型特定实现(应该是这样)。我如何检查它是否是通用集合,无论它是什么类型?

1 个答案:

答案 0 :(得分:3)

我想你只想:

var propertyType = property.PropertyType;

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

我现在在您的代码中看到您的Where远至右侧。那将是:

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

method GetGenericTypeDefinition从具体构造(“封闭”)泛型类型(例如DbSet<foo>)变为类型定义(此处为DbSet<TEntity>)。