实体框架 - 按名称获取实体

use*_*216 15 c# reflection entity-framework

我有以下代码(示例):

public dynamic GetData(string name) 
{
    using(var ctx = GetObjectContext()) 
    {
        switch (name) 
        {
        case "entity1":
            return ctx.entity1.ToList();
        case "entity2":
            return ctx.entity2.ToList();
        ......
        default:
            return null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想避免在此示例中切换.如何按名称查找所需的实体类,调用ToList()方法并返回数据?我可以用反射做到这一点吗?你能帮助我吗?

chi*_*oro 23

您可以使用反射来执行此操作,但是您还需要使用泛型,因为ToList()方法返回的列表类型对于每个实体类型都是不同的.

您可以通过反射访问属性getter,如下所示:

var enumerable = typeof([ClassNameOfContext]).GetProperty(name).GetValue(ctx, null);
Run Code Online (Sandbox Code Playgroud)

[ClassNameOfContext]ctx是其实例的类的名称.这在您的代码中并不明显,但您知道:-)

问题是,enumerable将是一个object并已被铸造到IEnumerable<EntityType>哪里EntityType是实体的,你正在访问的类型.换句话说,它取决于您传递的名称.如果使用泛型来确定类型,则可以正确地转换对象,而不必返回dynamic偶数.

public TEntity Get<TEntity>(string name)
{
    ...
Run Code Online (Sandbox Code Playgroud)

并从上面转换线:

var enumerable = (IEnumerable<TEntity>)(typeof([ClassNameOfContext]).GetProperty(name).GetValue(ctx, null));
return enumerable.ToList();
Run Code Online (Sandbox Code Playgroud)

干得好!

附录:可以想象,你也可以摆脱字符串参数 - 在可能的情况下应该避免在字符串中使用类型或属性的名称,因为它不是类型安全的.编译器无法识别它,并且重构等IDE功能不会考虑它.这里的问题是属性名称通常是实体类型名称的复数形式.但您可以使用反射来查找类型匹配的属性TEntity.我把这作为练习:-)