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