有没有办法像这样拥有一个开放的泛型类型参数的委托实例?
Action<T> SomethingHappened;
编译器给我一个错误。
我可能每两年问一次这个问题并忘记了。我找不到以前的类似问题,所以我还是问了。
我真正想做的是:
在实体框架中,我希望每当向表中添加一些新行或修改表中现有行中的某些数据时,我想编写一个通用的发布者框架,它可以告诉任何感兴趣的听众,这样那样的事情已经发生了。
例如,发布者可能会告诉所有有兴趣了解 Customer 表中的任何新行添加或Customer表中的任何修改的听众。
侦听器可能是记录器、电子邮件发送者等。
目前,我正在做的是一个 kludge,但我想要一个更安全的解决方案。这是我目前正在做的事情:
public partial class DaEntities : ObjectContext
{
Action<object, ObjectStateEntry> EntityModified;
Action<object, ObjectStateEntry> EntityDeleted;
Action<object, ObjectStateEntry> EntityAdded;
public override int SaveChanges(SaveOptions options)
{
var modifiedEntities =
ObjectStateManager.GetObjectStateEntries(
System.Data.EntityState.Added | System.Data.EntityState.Modified);
var deletedEntities =
ObjectStateManager.GetObjectStateEntries(
System.Data.EntityState.Deleted);
foreach (var entry in modifiedEntities)
{
var type = GetObjectType(entry.GetType());
// fire delegates here
}
return base.SaveChanges(options);
}
}
在上述情况下,我宁愿有这样的东西:
public static Action<T, ObjectStateEntry> EntityModified;
public static Action<T, ObjectStateEntry> EntityDeleted;
public static Action<T, ObjectStateEntry> EntityAdded;
并让他们指向一个像这样的通用方法:
public void SomethingHappenedToAnEntity<T, ObjectStateEntry>
(T t, ObjectStateEntry e)
{
// do stuff here
}