DbSet <tentity> .Find() - Reflection </tentity>

时间:2014-04-15 13:09:17

标签: c# asp.net-mvc entity-framework

我想:

...
int id = 5;
//DB is a instance of DbContext
MethodInfo methodFind = DB.GetType().GetMethod("Find");
var resultFind = methodFind.Invoke(entityCol, new object[]{id});

但是,#34; Invoke&#34;

会引发异常
"Object of type 'System.Int32' cannot be converted to type 'System.Object[]'."

有没有办法用反射调用DbSet.Find(params object [] keyValues)?


PS。

我在CustomAuthorization属性上使用它,我也接受改进这部分代码的建议。我试图检查某个实体(使用属性)的某个寄存器是否可以由某个用户通过其共同的&#34; CompanyId&#34;属性,继承自&#34; BaseModel&#34; (所以所有的桌子都有这个属性)

2 个答案:

答案 0 :(得分:3)

试试这个:

var resultFind = methodFind.Invoke(entityCol, new object[]{new object[]{id}});

要在对象[]中调用的第二个参数,它需要包含对象,映射Find方法的参数。 “查找”的第一个参数恰好是一个对象[],因此您需要将其嵌套。

答案 1 :(得分:1)

我用这个解决了这个问题:

var curEntityPI = DB.GetType().GetProperties().Where(pr => pr.Name == entityName).First();
var curEntityType = curEntityPI.PropertyType.GetGenericArguments().First();
var result = DB.Set(curEntityType ).Find(id);