来自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模板解决此重载) 运行时方法解析存在一些开销,因此您可能必须分析该方法的执行情况并确定是否会给您带来任何问题。