如何解决来自ObjectContext的EntityFramework EntityType?
| 我有一个带有此签名的方法:public void GenerateLog<TEntity>(TEntity entity) where TEntity : EntityObject
如何遍历ObjectContext并为ObjectContext中的每个实体调用此方法?
我知道我可以这样做:
foreach (ObjectStateEntry entry in
context.ObjectStateManager.GetObjectStateEntries(
EntityState.Added | EntityState.Modified))
{
string entityName = entry.Entity.GetType().Name;
}
但是我不知道如何从名称的字符串表示形式转换为GenerateLog<MYSTRING>
而不是GenerateLog<TEntity>
。
解决方法
您需要从
GenerateLog
中创建一个通用方法,然后调用它。我通常需要弄乱一点,然后才能运行类似的东西,但这应该很接近
MethodInfo generateLog = typeof(YourClass)
.GetMethod(\"GenerateLog\",BindingFlags.Public | BindingFlags.Instance );
MethodInfo genericGenerateLog = generateLog.MakeGenericMethod(entry.Entity.GetType());
genericGenerateLog.Invoke(this,new object[] { entry.Entity });
YourClass
只是GenerateLog所在的类。
, 正如Drew Marsh所说,无法仅使用泛型Type参数的名称来调用泛型方法。因此,我只能建议您使用运行时方法解析可能会断定是有点垃圾的解决方案-尽管它可以工作...
首先,在foreach
内分配一个动态变量,然后调用名为(8ѭ的私有方法:
foreach (ObjectStateEntry entry in
context.ObjectStateManager.GetObjectStateEntries(
EntityState.Added | EntityState.Modified))
{
dynamic dynamicEntity = entry.Entity;
CallGenerateLog(dynamicEntity);
}
...为您要记录的每种实体类型提供CallGenerateLog()
重载,并让每个重载调用您的GenerateLog()
方法,例如:
private static void CallGenerateLog(User user)
{
GenerateLog(user);
}
private static void CallGenerateLog(Customer customer)
{
GenerateLog(customer);
}
...等等...,并提供了一个全面的重载,它将满足编译器的要求,如果找到了您没有显式重载的Entity类型,则将调用该重载。
private static void CallGenerateLog(object entity)
{
}
问题包括:
每种实体类型都需要ѭ8重载,因此,如果要添加要记录的新实体类型,则必须记住为其添加重载(尽管您可以使用T4模板解决此重载)
运行时方法解析存在一些开销,因此您可能必须分析该方法的执行情况并确定是否会给您带来任何问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。