获取特定类型的集合属性

本文关键字:集合 属性 类型 获取 | 更新日期: 2023-09-27 17:54:30

我有一个类MyDatabaseContext,它有一系列的DbSet集合属性:

public DbSet<EntityA> EntitiesA { get; set; }
public DbSet<EntityB> EntitiesB { get; set; }
public DbSet<EntityC> EntitiesC { get; set; }

我需要得到给定实体类型的集合的名称。
例如,我有"EntityB",并希望得到"EntitiesB"的结果。

我真的想避免switch-case语句,因为MyDatabaseContext是自动生成的(T4模板)。

获取特定类型的集合属性

如果你只想要属性的名字,那就这样吧。我只是提炼一下亨特给出的答案。您可以使用相同的方法,将string作为返回类型。

    public string GetEntitiName<T>() where T : class
    {
        PropertyInfo propInfo = typeof(MyDatabaseContext).GetProperties().Where(p => p.PropertyType == typeof(DbSet<T>)).FirstOrDefault();
        string propertyName = propInfo.Name; //The string has the property name ..
        return propertyName;    
    }

我试了一个类似于你的情况的样品。尝试用DbSet替换List。

class Program
    {
        public static void GetEntities<T>() where T : class
        {
            var info = typeof(TestClass1).GetProperties().Where(p => p.PropertyType == typeof(List<T>));
            Console.WriteLine(info.FirstOrDefault().Name);
        }
        static void Main(string[] args)
        {
            GetEntities<int>();
            Console.ReadLine();
        }
    }
    public class TestClass1
    {
        public List<int> IntTest { get; set; }
        public List<double> DoubleTest { get; set; }
        public List<string> IStringTest { get; set; }
    }

我知道这是旧的页面,但我的答案可能对其他人参考这里有用。(像我这样)

我认为你想访问EntitiesB来运行查询,就像EntitiesB.Where(a=>a.bla=="blabla")一样。如果我是对的,或者这个页面的其他访问者需要这样的东西,只需简单地使用以下代码:

using System.Data.Entity.Infrastructure;
using System.Data.Objects;
((IObjectContextAdapter)_dbContext).ObjectContext.CreateObjectSet<EntityB>()

描述:

_dbContext is Context class inherting from DbContext.
EntitiesB is DbSet<EntityB> defined in Context class.

的例子:

Ilist result = ((IObjectContextAdapter)_dbContext).ObjectContext.CreateObjectSet<EntityB>().Where(b=>b.bla=="blabla").ToList();

您生成的文件是一个局部类,您可以创建一个新文件,并使用关键字partial声明一个同名的类,然后创建一个方法,该方法将返回所需的集合…

我自己实际上还没有这样做,但是听起来您想做的是使用反射来定位具有适当泛型类型参数的类型"DbSet"的属性。下面的伪c#应该可以让你入门:

foreach ( FieldInfo field in this.GetType() )
{
  if ( field.FieldType.IsGenericType )
  {
    foreach ( Type param in field.FieldType.GetGenericArguments() )
    {
      if ( param.Name == soughtType )
      {
        return field.Name;
      }
    }
  }
}
相关文章: