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
.我把这作为练习:-)
归档时间: |
|
查看次数: |
19059 次 |
最近记录: |