0

我有一个带有这个签名的方法:

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;
}

但我不知道如何从名称的 String 表示形式转到GenerateLog<MYSTRING>而不是GenerateLog<TEntity>.

4

2 回答 2

2

您需要从您的通用方法中创建一个通用方法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 所在的类。

于 2011-05-28T00:38:22.453 回答
-1

正如 Drew Marsh 所说,没有办法只使用泛型 Type 参数的名称来调用泛型方法。因此,我只能建议您使用运行时方法解析可能会判断为有点垃圾的解决方案 - 尽管它会起作用......

首先,在 内部分配一个动态变量foreach,并调用一个名为 (eg) 的私有方法CallGenerateLog()

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);
}

...等...并提供一个包罗万象的重载,它将满足编译器并在找到您没有显式重载的实体类型时被调用。

private static void CallGenerateLog(object entity)
{
}

这方面的问题包括:

  1. 每个实体类型都需要重载CallGenerateLog(),因此如果添加要记录的新实体类型,则必须记住为其添加重载(尽管您可以使用 T4 模板解决此问题)

  2. 运行时方法解析有一些开销,因此您可能必须分析该方法的执行情况并确定它是否会给您带来任何问题。

于 2011-05-28T00:20:27.083 回答