获取特定类型的集合属性

时间:2011-05-02 17:21:48

标签: c#

我有一个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模板)。

4 个答案:

答案 0 :(得分:1)

如果您只想在这里找到该物业的名称。我只想改进猎人给出的答案。您可以使用与字符串相同的方法作为返回类型。

    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; }
    }

此示例有效。

答案 1 :(得分:1)

我知道这是旧页面,但我的回答可能对其他在这里提到的人有用。 (像我一样)

我认为您想访问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();

答案 2 :(得分:0)

您生成的文件是一个部分类,您可以使用关键字partial创建一个新文件并声明一个具有相同名称的类,然后创建一个返回所需Collection的方法...

答案 3 :(得分:0)

我自己实际上并没有这样做,但听起来你想要做的就是使用反射来定位具有适当泛型类型参数的“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;
      }
    }
  }
}